人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

php5でsimpleXMLを使っているのですが、名前空間の接頭辞のついた属性を取得する方法がわかりません。

<document>
<note ns:data="foo"></note>
</document>

こんな感じのイメージで"foo"を取得して配列に落とし込みたいのです。どなたかお知恵をいただけませんでしょうか。

●質問者: hiroshimo
●カテゴリ:ウェブ制作
✍キーワード:イメージ 名前空間 属性 接頭辞 配列
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● hatettyo
●27ポイント
$sample = array();
$data = @simplexml_load_file(XMLのURL);
$sample[] = $data->document->note;

こうゆう事でしょうか。

documentが複数ある場合は

$sample = array();
$data = @simplexml_load_file(XMLのURL);
foreach($data->document as $value){
 $sample[] = $value->note;
}

という感じですかね。

http://q.hatena.ne.jp/1201158240


2 ● tezcello
●27ポイント

名前空間が指定されている属性値を指定して取出したいという事でしょうか?

$str = <<< EOL
<?xml version="1.0" encoding="UTF-8"?>
<docs xmlns:ns="http://hoge/fuga/">
<document>
<note ns:data="foo">abcde</note>
</document>
<document>
<note ns:data="foo">edcba</note>
</document>
<document>
<note data="foo">123</note>
</document>
<document>
<note ns:data="boo">abcde</note>
</document>
</docs>
EOL;

$xml = simplexml_load_string($str);

$xml->registerXPathNamespace('namespace', 'http://hoge/fuga/');
var_dump($xml->xpath('//note[@namespace:]'));print "<br>\n";

$res = $xml->xpath('//note[@namespace:data="foo"]');
var_dump($res);

結果は、

array(2) {

[0]=>

object(SimpleXMLElement)#2 (1) {

[0]=>

string(5) "abcde"

}

[1]=>

object(SimpleXMLElement)#3 (1) {

[0]=>

string(5) "edcba"

}

}

そうじゃなくて、どんな属性が使われているかなら、

一旦 file_get_contents などで読み込み、

名前空間の接頭辞(xmlns をキーにして探す)を preg_match() 等で見つけて、

その接頭辞のついている属性を preg_match_all で探して配列に入れる

という手順が考えられます。

http://jp.php.net/manual/ja/function.simplexml-element-registerX...


3 ● tezcello
●26ポイント ベストアンサー

フローを示すだけではアレなんで...

$str = <<< EOL
<?xml version="1.0" encoding="UTF-8"?>
<docs xmlns:ns="http://hoge/fuga/">
<document>
<note ns:data="foo">abcde</note>
</document>
<document>
<note ns:data="hoo">edcba</note>
</document>
<document>
<note data="poo">123</note>
</document>
<document>
<note ns:data="boo">abcde</note>
</document>
</docs>
EOL;

$prefix = ''; $ns = '';

// 接頭辞や名前空間が既知なら上で定義すれば下3行は不要
if (preg_match('/xmlns:([-\w.]+)="(.+?)"/', $str, $tmp)){
 $prefix = $tmp[1]; $ns = $tmp[2];
}

preg_match_all('/\s'.$prefix.':([-\w.]+)="(.*?)"/', $str, $tmp);

var_dump($tmp[2]);

// simplexml での処理が必要ならこの先も
//$xml = simplexml_load_string($str);
//$xml->registerXPathNamespace('namespace', $ns);
//$res = $xml->xpath('//note[@namespace:data="foo"]');
//var_dump($res);
// 次の行が得られる
// array(1) { [0]=> object(SimpleXMLElement)#2 (1) { [0]=> string(5) "abcde" } }

array(3) { [0]=> string(3) "foo" [1]=> string(3) "hoo" [2]=> string(3) "boo" }

http://jp.php.net/manual/ja/function.preg-match-all.php

◎質問者からの返答

回答ありがとうございます。非常にためになりました。少し質問のしかたがまずかったように思うので再度提示させていただきたいと思います。

<document>

<note data="foo">A</note>

<note data="bar">B</note>

</document>

うえのようなXMLがあったとして、AとかBを取り出そうとしたらこうですよね?

foreach ($xml as $document) {

echo $document->note, '
';

}

fooとかbarを取り出そうとしたら、こうですよね。

foreach ($xml as $document) {

echo $document->note[data], '
';

}

これをしたいのですが、dataにns:という接頭辞が付いているとうまくいきません。

foreach ($xml as $document) {

echo $document->note[ns:data], '
';

}

というようなことを解決したいのですが・・・。どうしたらいいのでしょう?

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ