<document>
<note ns:data="foo"></note>
</document>
こんな感じのイメージで"foo"を取得して配列に落とし込みたいのです。どなたかお知恵をいただけませんでしょうか。
フローを示すだけではアレなんで...
$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" }
$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; }
という感じですかね。
名前空間が指定されている属性値を指定して取出したいという事でしょうか?
$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...
フローを示すだけではアレなんで...
$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" }
回答ありがとうございます。非常にためになりました。少し質問のしかたがまずかったように思うので再度提示させていただきたいと思います。
<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], '
';
}
というようなことを解決したいのですが・・・。どうしたらいいのでしょう?
回答ありがとうございます。非常にためになりました。少し質問のしかたがまずかったように思うので再度提示させていただきたいと思います。
<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], '
';
}
というようなことを解決したいのですが・・・。どうしたらいいのでしょう?