XMLで同名異種のタグを区別してコンテンツを取得する方法

このQ&Aのポイント
  • XMLで同名異種のタグを区別してコンテンツを取得する方法について解説します。
  • getElementByTagNameを使用して<neko>タグの中身を取得する際、<animal>の中にある<neko>の中身を取得する方法を紹介します。
  • DOMを使用することで、<neko>タグの中身を取得することが可能です。正規表現は最終手段として使用されることがあります。
回答を見る
  • ベストアンサー

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

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

  • PHP
  • 回答数1
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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 ペルシャ ぶち

ict-km48tz
質問者

お礼

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

関連するQ&A

  • XML::XPathでのタグの取り出し

    perl勉強し始めの初心者ですが、よろしくお願いします。 自分なりに調べたつもりですが分からなかったので質問させていただきます。 perlでXMLをHTMLとTEXTに変換したくてParser、Simple、DOMなどを試し、最終的にXPathにたどり着きました。 でも、XPathでの同じタグの取出しができません。 -------------------------------------------- <root> <man> <name>あああ</name> <id>11111</id> <tel>111-1111</tel> </man> <man> <name>いいい</name> <id>2222</id> <tel>222-2222</tel> </man> <man> <name>ううう</name> <id>3333</id> <tel>333-3333</tel> </man> </root> -------------------------------------------- このような場合の<name>の「あああ」だけを取り出したいのですが、 "root/man/name" だと、<name>の中身が全部出てきてしまいます。 "root/man/name[1]" でもだめでした。 どなたか分かる方いらっしゃいましたら、教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • タグからタグまでの値を取得するには?XML! XML!

    http://xml-jp.amznxslt.com/onca/xml3?t=muryoodotcom-22&dev-t=D2MISJUPVI1VMB&KeywordSearch=dvd&mode=dvd-jp&type=lite&page=1&f=xml&locale=jp このページのですね、2番目のdetailsタグのなかの ProductNameタグの中身の"タイガー & ドラゴン DVD-BOX"という値を取得したいのですが、どうすればいいでしょう?

  • XMLへDOMでタグの追加

    次のようなXMLにDOMで、タグを追加しようとしているのですが、 追加される場所が思った所に追加されません。 正常XMLにようにしたいのですが、どうすれば良いでしょうか? --元XML----------------- <root> <item>a</item> <item>b</item> </root> --結果XML----------------- <root> <item>a</item> <item>b</item> <info>xxxx</info> </root> --正常XML----------------- <root> <info>xxxx</info> <item>a</item> <item>b</item> </root> -- プログラム ---------------- MSXML::IXMLDOMDocumentPtr xmlDoc = NULL; MSXML::IXMLDOMNodeListPtr pNodes; MSXML::IXMLDOMNodePtr pNode; MSXML::IXMLDOMElementPtr pElem; xmlDoc.CreateInstance ("Msxml2.DOMDocument"); xmlDoc->load( ファイル名 ); pNodes = xmlDoc->selectNodes(L"/root"); pNode = pNodes->Getitem(0); pElem = xmlDoc->createElement(L"info"); pNode->appendChild( pElem ); 環境:WinXP+IE7+VC6

    • ベストアンサー
    • XML
  • XMLタグ情報取得

    PHPにxmlファイルのタグ情報を利用するシステムを構築したいのですが、調べてもよく解らなかったため質問させて頂きます。 PHPは勉強経験があるため解るのですがXMLはまったくの初心者です。 システムは以下の流れです。 システムA(PHP) <?php  $i;  if($iがシステムBで使用されているか確認){   使用されている場合$iで処理  }else{   使用されていない場合xmlファイルからタグ情報取得   for($iの親タグ<B>を取得){    if(<$i><$j><$k>のどれかがシステムBで使用されていないか?){     $jが使用されていた場合、システムAの$iと、システムBの$jは同じ使用用途のデータと判断し処理    }   }  } xmlファイル <?xml version="1.0" encoding="EUC-JP"?> <A> <B> <$i></$i><$j></$j><$k></$k> </B> </A> このようなシステムを構築したいのでご教授お願いします。 違うシステム同士でデータを利用する際、同じ使用用途でもシステムによって名称が異なる場合にも対応できるシステムを課題としています。 また、DOM方式を利用した方法だと助かります。 環境はXP、PHP5、Apache2.0です

    • ベストアンサー
    • PHP
  • XMLの読み込み

    DocumentBuilderFactory,DocumentBuilder等を使って XMLドキュメントの読み込みを行っています。 例えば、以下の様なXMLドキュメントがあった時 <text>内の読み込みを行うと、テキストテキスト2と なってしまいます。 「テキスト<p/><p/>テキスト2」として取得したいのですが 何かいい方法ないでしょうか? ----------------------------------------- <?xml version="1.0" encoding="Shift_JIS"?> <root> <text> テキスト<p/><p/>テキスト2</text> </root> ----------------------------------------- それとも、XMLドキュメント上、「<p/>」に意味があるのでしょうか? ※プログラム一部抜粋 //-- DOMオブジェクト初期化 DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); //-- XMLファイル読み込み this.doc = docBuilder.parse(new File(strPath)); this.doc.getDocumentElement().normalize();

    • ベストアンサー
    • Java
  • jQueryでXMLを書き換えた後に全体を取得する

    初めて質問させていただきます。 JavaScript(jQuery)でXMLを扱っているのですが、 var d = $.parseXML(xml); var n = $(doc.getElementById('person')); $(n).attr('age', 18); のようにDOMでXMLの中身を書き換えた後、"html()"のようにXML全体を簡単に取得する方法はあるのでしょうか? どなたかご存知の方がいらっしゃいましたら、教えていただければ幸いです。 よろしくお願いいたします。

  • IE7(だけ?)でXMLが表示できない。

    IE7(だけ?)でXMLが表示できない。 お世話になります。 現在、PHP5.2とAJAXでHPを作成しています。 XMLを吐き出すphpのプログラムをOperaブラウザで 表示してできたのですが。 同じphpのプログラムを、IE7ブラウザからURLをたたくと ↓の様なエラーが発生します。 The XML page cannot be displayed Cannot view XML input using XSL style sheet. Please correct the error and then click the Refresh button, or try again later. -------------------------------------------------------------------------------- テキストの内容に無効な文字が見つかりました。リソース 'http://….php' の実行エラーです。ライン 2、位置 45 <root><ctg_info><ctg_cd>1</ctg_cd><ctg_name> なぜなのでしょうか? 解決策を教えてください。 エンコードに問題があるのでしょうか?? どうかお願いいたします。 XMLを吐き出すphpは↓の通りで、 $dom = new DOMDocument('1.0', 'UTF-8'); …いろいろ中身をdomの要素を追加していく。… print $dom->saveXML(); ちなみに、吐き出されるXMLは↓の通りです。 <?xml version="1.0" encoding="UTF-8"?> <root> <ctg_info> <ctg_cd>1</ctg_cd> <ctg_name>設計</ctg_name> <naiyo_info> <naiyo_cd>1</naiyo_cd> <naiyo_name>仕様打合せ</naiyo_name> </naiyo_info> </ctg_info> </root> ちなみに、phpの $dom = new DOMDocument('1.0', 'UTF-8'); を $dom = new DOMDocument('1.0', 'EUC-JP'); と変更すると、↓のワーニングが出てしまいます。 Warning: DOMDocument::saveXML() [domdocument.savexml]: output conversion failed due to conv error, bytes 0xC0 0xDF 0xB7 0xD7 どうか、お願いいたします。

    • ベストアンサー
    • XML
  • XML::DOM / XML::XPathでソート

    XML::DOMで効率的なソートの方法はどんなものがありますでしょうか。 一応動くものは作れたのですが、効率的とは言い難く、しかも ソート項目が一意のデータでないといけないという欠点があります。 ############################################### use XML::DOM::XPath; my $xml = <<EOM; <?xml version="1.0" encoding="UTF-8" ?> <list> <item id="10">Apple</item> <item id="5">Orange</item> <item id="20">Melon</item> </list> EOM my $parser = XML::DOM::Parser->new(); my $doc = $parser->parse( $xml ); ## <item>タグの一覧を作成 my @list = $doc->findnodes('/list/item'); ## <item>タグ id属性一覧を作成 my @idlist = map{ $_->getAttribute("id") } @list; ## id属性順にソート foreach my $id ( sort{ $a<=>$b } @idlist ){ ## id属性値を指定してノードリストを取得 my @item = $doc->findnodes('/list/item[@id='.$id.']'); ## idは一意なのでリストの先頭で固定 print $item[0]->getAttribute('id')."\n"; print $item[0]->getFirstChild->getNodeValue."\n"; } ############################################### ハッシュなら sort{ $hoe{$b} <=> $hoe{$a} } keys %hoe といった方法があるのですが、XML::DOMの場合は同じようにいきません。 良い方法がありましたらお願いします。

    • ベストアンサー
    • Perl
  • VBscriptでXMLデータの抽出に関する質問

    教えて下さい。以下のようなXMLファイルがあります。 <?xml version="1.0" encoding="Shift-JIS"?> <ROOT> <INFO> <NO>0001</NO> <NAME>ABC</NAME> <COMMENT> </COMMENT> <AGE>30</AGE> </INFO> </ROOT> これを以下のようにVBScriptにてデータを取り出したいです。 Dim DOM, docRoot, node, nodeList, i, m Dim objADO, objADO2 Dim objRS Dim sqlstmt, strSQL Dim no, comment 'DOMオブジェクト生成 Set DOM = CreateObject("Microsoft.XMLDOM") '同期モード DOM.async = True 'XMLを読み込む DOM.load("11.xml") 'ルートセット Set docRoot = DOM.documentElement 'ノードの設定 Set nodeList = docRoot.selectNodes("/ROOT/INFO") 'ループ For Each node In nodeList For i = 0 to node.ChildNodes.length - 1 Select case node.childNodes(i).nodeName case "NO" no = node.childNodes(i).firstChild.nodeValue case "COMMENT" comment = node.childNodes(i).firstChild.nodeValue End select Next Next ところがCOMMENTタグのようにデータが空のものがあると 「オブジェクトがありません」とエラーになります。 if Not IsNull(node.childNodes(i).firstChild.nodeValue) then というようにもやってみましたが、これでも同じエラーとなってしまいます。 何か方法はないでしょうか?アドバイスを宜しくお願いします。

    • ベストアンサー
    • XML
  • XMLのタグの有無をPHPで判定したい。

    example1.xml ----------------------- <item>  <color>red</color>  <omake>candy</omake> </item> ----------------------- example2.xml ----------------------- <item>  <color>black</color> </item> ----------------------- 上記はXMLファイルの2パターンを示したものです。 商品(item)によって、オマケ(omake)があったりなかったりします。 オマケがない時には、タグ自体存在しません。 なので、タグがない時に、そのデータをDOMで取得しようとすると、 エラーが吐かれます。 Notice: Trying to get property of non-object in~~~ 私がしたいことは、 タグがない場合には、値を取得しない。 という分岐をさせることです。 例えば、 $items = $doc->getElementsByTagName('color'); if(isset($items)){echo $items->item(0)->nodeValue;} こんな感じで考えたのですが、ダメでした。 タグが無くても、$itemsはNULLではないため、 if文の中に入ってしまい、 結局、$items->item(0)->nodeValue; を通過しようとして、 Notice: Trying to get property of non-object in~~~ が吐かれます。 ($itemsは、object(DOMNodeList)#3 (0) { }といった内容で、NULLではない。) また、 if(isset($items->item(0)->nodeValue)){  echo $items->item(0)->nodeValue; } のようにすると、 isset()のところで、やはり、 $items->item(0)->nodeValue を通過しようとして、 Notice: Trying to get property of non-object in~~~ が吐かれます。 こういった場合、どうしたら良いのでしょうか。 宜しくお願いします。 (PHP5の環境です。)

    • ベストアンサー
    • PHP