うちのカレーにはこれが入ってる!って食材ありますか?

初めまして、PHPプログラミング初心者です。

例としまして。
<xml>
 <data>
  <aa:A1>
   <aa:A2>
    <aa:A3>これが取りたい</aa:A3>
   </aa:A2>
  </aa:A1>
 </data>
</xml>

このように同じnamespaceが連続している場合の<aa:A3>までの
アクセス方法をご教授願います。

A 回答 (1件)

===========PHPのコード===========


<?php
$doc = new DOMDocument();
$doc->resolveExternals = true;
$doc->strictErrorChecking = true;
$doc->recover = false;
$doc->load("Q5605930-1.xml");
$xpath = new DOMXPath($doc);
$xpath->registerNamespace ( "ns" , "http://himajin100000.example.com/" );
$nodes = $xpath->query("/xml/data/ns:A1/ns:A2/ns:A3");
for($i = 0;$i < $nodes->length;$i++){
print($nodes->item(0)->namespaceURI . "\n");
print($nodes->item(0)->localName . "\n");
print($nodes->item(0)->textContent . "\n");
}
?>
========用いたXMLファイル==========
<xml>
<data>
<aa:A1 xmlns:aa="http://himajin100000.example.com/">
<aa:A2>
<aa:A3>これが取りたい</aa:A3>
</aa:A2>
</aa:A1>
</data>
</xml>
=======結果(何を求めたいのかよく判らなかったから適当に)=======
http://himajin100000.example.com/
A3
これが取りたい
=============その他===========
SimpleXMLあまり好きじゃないので書かない。DOMのみ。(初心者には簡易な記法が好まれるが、一貫性の方が重要で安易に簡易さを求めるべきではないという立場の俺としては複雑な心境である)

XMLに名前空間宣言はちゃんと含めてください。

DOMXPathのregisterNamespaceの第一引数は
DOMXPathのqueryメソッドで使われるXPath式のものであれば何でも良い、ということを一応示すために、元のXMLの名前空間接頭辞aaを使わないようにした。

gooはURIっぽい文字列の連続するUS-ASCIIの文字の最初と最後に不可視の文字を付け加えるので取り除いてから動かすこと。

一応xmlで始まる要素名は予約されているので、安易に使うと新しく規格が出来たときに困るかもしれないから覚悟してね
    • good
    • 0
この回答へのお礼

丁寧な回答ありがとうございます。
自分はsimplexmlで実行していた為、DOMについては全く知識が
ないのですが、調べながら実装してみようと思います。

結果を明確に記述していなくてすみませんでした^^;
”これが取りたい”とういう文字列を取得したかったので、
上記の回答でばっちり分かりました^^

お礼日時:2010/01/19 23:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報