重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

XMLにおける同名異種のタグを区別して、そのコンテンツを取り出すには?

<?xml version='1.0'?>
<root>
 <animal>
  <neko>ペルシャ</neko>
 </animal>
 <pet>
  <neko>三毛</neko>
 </pet>
</root>

上記コードから、
getElementByTagName('neko')のようにして、
<neko>タグの中身を取得したいのですが、
ただ、取得したいのは、<animal>の中にある<neko>の中身であって、
<pet>の中にある<neko>の中身ではないんです。
こういった場合、同じ<neko>でも区別して、中身を取得する方法はありますか?

方法としては、DOM的に取得したいと思っています。
つまり、正規表現で云々というのは、最終手段としたいわけです。

おそらく、初歩的な質問だとは思いますが、
どうか宜しくお願い致します。

環境:PHP5

A 回答 (1件)

=============Q5969855-1.xml================


<?xml version='1.0'?>
<root>
<animal>
<neko>ペルシャ</neko>
</animal>
<pet>
<neko>三毛</neko>
</pet>
<x>
<animal>
<neko>ぶち</neko>
</animal>
</x>
</root>
==============Q5969855-1.php050302================
<?php
header("Content-Type:text/plain;charset=UTF-8");
$doc = new DOMDocument();
$doc->load("Q5969855-1.xml");
$xpath = new DOMXPath($doc);
$nodelist = $xpath->query("/root/animal/neko");
print("a\n");
for ($i = 0; $i < $nodelist->length; $i++) {
echo $nodelist->item($i)->textContent . "\n";
}
print("b\n");
$nodelist = $xpath->query("/root//animal/neko");
for ($i = 0; $i < $nodelist->length; $i++) {
print($nodelist->item($i)->textContent . "\n");
}

?>
===================出力結果=================
a
ペルシャ
b
ペルシャ
ぶち
    • good
    • 0
この回答へのお礼

XPathを使う方法があるんですね、ありがとうございます。
おかげさまで、なんとかなりそうです。

あと1つ、お聞きしたいのですが、
<neko>までの階層が深い場合、

/root//animal/neko

のようなパス表記は、どのようにすべきでしょうか?
<root>
 <ikimono>
  <honyurui>
   <ke_bukai>
    <nekoka>
     <animal>
      <neko>ペルシャ</neko>
~~略~~
</root>
なんて場合です。
さらに、実際のXMLの階層構造は複雑で、
ルートから見て、目的の要素が、何階層下かが分かりにくいなんて場合を想定して
回答頂けると助かります。
宜しくお願い致します。

お礼日時:2010/06/15 11:37

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