• ベストアンサー

XML:連番要素の全ての子要素にxPath式でアクセスするには

xml文書1 <?xml version="1.0"> <customer0> <name>aaaa</name> <tel>1234</tel> </customer0> <customer1> <name>bbbb</name> <tel>2345</tel> </customer1> xml文書2 <?xml version="1.0"> <customer> <name>aaaa</name> <tel>1234</tel> </customer> <customer> <name>bbbb</name> <tel>2345</tel> </customer> xml文書1のcustomerの子要素(name,tel)を全て取得したいです。 ルートノードから辿って行くのではなく、ダイレクトにアクセスしたいです。 xPath式で子要素を全て取り出すことはできますでしょうか? xml文書2であれば「//customer」で可能だと思うんですが。 宜しくお願い致します。

  • XML
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
回答No.2

ルートノードがない地点でXML文書として認められない。 何かの書き間違いであると信じて要望を予測してみる。少なくとも何かのヒントにはなるはず ==============Q4374721-1.xml================ <?xml version="1.0" encoding="UTF-8"?> <customers> <customer0> <name>aaaa</name> <tel>1234</tel> </customer0> <customer1> <name>bbbb</name> <tel>2345</tel> </customer1> </customers> ==============Q4374721-1.xsl================ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" /> <!-- お好みで --> <!-- templateは後から書いたものが優先されるので, ルート要素のcustomers要素は下のテンプレートに引っかかる 数字をチェックしているわけではなく単にcustomerで始まる要素をマッチさせているだけなので customersABCのような要素でもヒットする。 まぁその辺はXPathのsubstring関数とか,number関数に通してNaNかチェックしたり andで条件つなげればどうにでもなるでしょ? --> <xsl:template match="//*[starts-with(local-name(),'customer') and namespace-uri()='']"> <item> <xsl:value-of select="name" /> </item> </xsl:template> <xsl:template match="/*"> <list> <xsl:apply-templates /> </list> </xsl:template> </xsl:stylesheet> ==============Q4374721-2.xml(結果)================ <?xml version="1.0" encoding="UTF-16"?> <list> <item>aaaa</item> <item>bbbb</item> </list>

ton_jiru
質問者

お礼

ありがとうございます。 関数が使えるんですね。参考になりました。

その他の回答 (1)

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

できる事はできるけど文書1のxmlは美しくないねぇ・・・ 結局xPathで使われるのはmatchする文字列を生成できれば良いので名前+数値と判っているならそういう文字列合成をしてアクセスすれば良い。 できたかどうか判らないけど customer* とか。

ton_jiru
質問者

お礼

ありがとうございます。

関連するQ&A

  • XML::XPathを使う

    エラーがでて期待する出力が出ず困っています。 ファイル名とXPathのコマンドライン引数をとり、 指定されたパスに一致するノードを出力するものです。 (参考書の写しなので、記述ミスはないと思います。) ■grabber.pl use XML::XPath; use XML::XPath::XMLParser; my $xpath = XML::XPath->new( filename => shift @ARGV ); my $nodeset = $xpath->find( shift @ARGV ); foreach my $node ( nodeset->get_nodelist ) { print XML::XPath::XMLParser::as_string( $node ) . "\n"; } コマンドラインに入力しているものは、 perl grabber.pl data.xml "/inventory/category/item/name" ■data.xml <?xml version="1.0"?> <inventory date="2001"> <category> <item id="2"> <name>aaaa</name> </item> </category> </inventory> です。 perl grabber.pl data.xml "/inventory/category/item/name" としても、下記にエラーが出ます。 Can't locate object method "get_nodelist" via package "nodeset" (perhaps you for got to load "nodeset"?) at grabber.pl line 5. いろいろ試してみたり調べたのですが、 行き詰ってしまいました。 期待する出力は"<name>aaaa</name>"なのですが・・・ どなたかこのエラーの原因がおわかりになるかた いらっしゃいますでしょうか。 環境は以下になります。 ・windowsxp ・activePerl モジュールのインストール済み ・XML-XPath ・XML-Parser 以上です。

    • ベストアンサー
    • Perl
  • XMLのXPathについて

    下記のようなXMLがあるとして、XPathでdataノードを取得する場合、 /root/node/dataと/root/dataの二通りがあると思いますが、これを一つにまとめて書くことは可能でしょうか? また、dataノードに辿りつくのに、途中のパスがすべて把握できない場合(/root/AAA/data、/root/BBB/CCC/data。。。) XPathでdataノードを取得することができますでしょうか? GetElementsByTagName("data")にした方が良いでしょうか? <?xml version="1.0" encoding="UTF-8"?> <root> <node> <data>データ1です</data> </node> <node> <data>データ2です</data> </node> <data>データ3です</data> </root>

    • 締切済み
    • XML
  • 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
  • c++でxpath指定でXML

    c++でプログラミングを学んでいます。 XMLを使って設定ファイルを作ろうと思っています。 プログラム側で、あらかじめどのようなフォーマットのXMLかは知っているので、 ルートからのxpathを文字列で指定して要素を読みに行きたいのですが、 どのライブラリがこれを出来るのかわからない(1)、 また、サンプルが見付からない(2)、 ので困っています。 (1)と(2)について教えてください。★ (1)については、XercesとXalanとlibxml2が出来そう?、 (2)については直接指定のサンプルを全くみつけられていない、というところです。 (ソースコードについてくるサンプルでも直接指定は見つけられていなくて、複雑だと読めなくて困ってます。) (出来そうだという書き込みは、日本語圏・英語圏でちらほら見られる。) 因みに、boost::property_treeで読もうと思ったりしましたが、属性を検索キーにする必要があって、xpathが利用できないと複雑なプログラムを書かないとならないので、やめました。 そこまでするならXMLのフォーマットを変えよう→XMLの意味が無い→何としてもxpath、と…。 よろしくお願いします。

  • XML::XPath -- 追加したノードが見付からない

    XMLのテンプレートを既存のXMLに追加したのですが、 その後 findnodes() で検索しても合致しません。 XML::XPath::Node::Element->new() を使って作成したものは 合致してくれます。 XML::XPath::XMLParser でパースしたものを追加して findnodes() で合致させるにはどのようにしたらよいのでしょうか。 ------------------------------- use XML::XPath; #### 元のXML my $xmldata = <<EOM; <?xml version="1.0" encoding="UTF-8" ?> <list>   <item>orange</item>   <item>apple</item>   <item>lemon</item> </list> EOM ### 追加するXMLのテンプレート my $xmlappend = <<EOM;   <item>pine</item> EOM ## 追加先ノードを取り出す my $xml = XML::XPath->new( xml=>$xmldata ); my ($list) = $xml->findnodes('/list'); ## 追加用XMLを作成して追加 my $append = XML::XPath::XMLParser->new( xml=>$xmlappend )->parse; $list->appendChild( $append ); ## もういっこ追加。こちらはこの場で作る $newnode = XML::XPath::Node::Element->new('item'); $newtext = XML::XPath::Node::Text->new('banana'); $newnode->appendChild( $newtext ); $list->appendChild( $newnode ); ## 現状確認 → pine は入っていた print $list->toString."\n"; ## item一覧を取得 @nodes = $xml->findnodes('/list/item'); ## 一覧を出力 → 追加した pine が出力されない。 bananaはある。 map{ print $_->toString."\n" } @nodes;

    • ベストアンサー
    • Perl
  • jQueryでxmlの異なるタグ要素を取得したい。

    jQueryを最近勉強したての者です。 詳しい方、どうか教えて下さい。 HTMLにxmlのデータを読み込ませようとしています。 概略をお話しすると、 htmlファイルによって、xmlの別々の要素を取得したいのです。 やりたいメソッドは同じです。 別々の要素の中のデータによって、imgの表示/非表示を切り替えたいのです。 問題は、対象となるhtmlファイルが複数あり そのhtmlファイルによって、参照するxmlのタグが異なる事なんです。 xmlは、以下のように<shopdata>をルートノードとし、以下のような感じです。 --------------------- <?xml version="1.0" encoding="utf-8"?> <shopdata> <item> <name1>0</name1> <name2>1</name2> <name3>0</name3> </item> </shopdata> --------------------- <name*>~</name*> の中のデータは、0もしくは1なのですが 0の時はimgを表示 1の時はimgを非表示させようと考えています。 ただ<name1><name2><name3> とタグ名がバラバラなんです。 ※おしりの数字が違うだけで、規則的ではあります。 ちなみにhtmlは複数あって  a.htmlの時は→xmlの<name1>を参照  b.htmlの時は→xmlの<name2>を参照  c.htmlの時は→xmlの<name3>を参照 という感じです。 ※htmlファイル名は特に規則的ではなく、いろいろなファイル名がついています。。。 最初、考えたのは、 htmlのどこかに、id="1"と入れて、idが1の時は、<name1>の要素を取得し、 htmlのどこかに、id="2"と入れて、idが2の時は、<name2>の要素を取得し… っていうことを考えたのですが、それもどのように書いたら良いのかが分からないんです。 そもそも、そういった事は可能なのでしょうか? ちなみのhtmlのbodyタグ自体がテンプレートでできているので、 idをどこかにふるとしたら、head内とかになるのしょうか? それぞれ、ボタンの表示は、 if文を使って、show(),hide()メソッドを使うとは思うのですが… 詳しくコードを教えていただけたら、助かります。 どうか、宜しくお願いいたします。

    • ベストアンサー
    • AJAX
  • RDFの名前空間の要素をxpathで取得したい

    http://xurrency.com/2.5/usd/to/jpy/feed こちらのURLのdc:valueの値を取得したく、今日初めてPHPを使ってみました。 ネットのいろいろなサンプルを見てみると、xpathで取得できることがわかり、 取得したい値が名前空間という要素だということがわかりました。 コードを書いてみたのですが、ブラウザで読み込むと「Array」という数値が 戻ってきてしまいます。dc:valueの値を取得するにはどのようにコードを 書けばよいでしょうか? (サーバーのPHPのバージョンは5.2.6です。) <?php $xml = simplexml_load_file("http://xurrency.com/2.5/usd/to/jpy/feed"); $xml->registerXPathNamespace('dc', 'http://purl.org/dc/elements/1.1/'); $result = $xml->xpath("//dc:value"); echo $result; ?>

    • ベストアンサー
    • PHP
  • removeChildを使っても変化なし PHP5.0

    idが条件に合ったら子ノードを削除する。という簡単なことをしたいのですが、サンプルソースをコピーして簡単なソースを作りましたが、何を変えてもエラーメッセージも出なければ、XMLファイルに変化もありません。 どなたか詳しい方削除ができない理由を教えてください。 books.xml <?xml version="1.0" ?> <data> <p><name id="1">aaaa</name><ad>1111</ad></p> <p><name id="2">bbbb</name><ad>2222</ad></p> <p><name id="3">cccc</name><ad>3333</ad></p> <p><name id="4">dddd</name><ad>4444</ad></p> <p><name id="5">eeee</name><ad>5555</ad></p> <p><name id="6">ffff</name><ad>6666</ad></p> </data> xmltest.php <?php //ドキュメントオブジェクトの作成 $doc = new DOMDocument(); //XML 文書ファイルのパース(DOM ツリーの作成) $doc->load("books.xml"); $id='3'; //DOMXPath オブジェクトの作成 $xpath = new DOMXPath($doc); //ローケーションパスの作成 $query = "/data/p[name[@id='$id']]"; //XPath を評価する 戻り値は、DOMNodeList $nodeList = $xpath->query($query); $pNode = $nodeList->item(0); //print $pNode -> textContent; //"data"要素ノードの取得 $dataElement= $doc->getElementsByTagName("data")->item(0); //print $dataElement -> textContent; //データを削除する $dataElement->removeChild($pNode); ?> これでidが3の行を消したいです

    • 締切済み
    • XML
  • VBscriptでXMLのファイルから、XPathで指定したデータを読

    VBscriptでXMLのファイルから、XPathで指定したデータを読み込みたいと思っていますが、 XMLファイル中に指定したXPathのタグがない場合、"オブジェクトがありません。" というエラーになってしまいます。 このような場合、どのような処理にすれば良いのでしょうか?親タグ、子タグなどを総当りで、存在するか調べないといけないのでしょうか?以下のようなスクリプトです。 Set xmlDoc = WScript.CreateObject("MSXML2.DOMDocument") With xmlDoc .Async = False .Load("aaaa.xml") xpath01 = "/tag1/tag2/tag3" Set xmlNode = .selectSingleNode(xpath01) MsgBox xmlNode.text End With

  • 既存のXMLを別のXMLの要素として追加する方法

    JavaでDOMを使用して、既に作成してあるXMLを別のXMLの要素として追加しようと思っているのですが、なかなか上手くいかないので投稿いたしました。 具体的に以下のような既存のXMLファイルがあると仮定して、 <?xml version="1.0" encoding="UTF-8"?> <a> <b>0</b> <c>1</c> <d>2</d> </a> 上記のXMLの親ノード(逆に言えば、このXMLの子ノードとして上記XMLを追加)にあたるXMLは以下のようになっています。 <?xml version="1.0" encoding="UTF-8"?> <A> </A> そして<A>と</A>の間に既存のXMLを追加して、 <?xml version="1.0" encoding="UTF-8"?> <A> <a> <b>0</b> <c>1</c> <d>2</d> </a> </A> のようにしたいと考えています。 よろしくお願いします。

    • ベストアンサー
    • Java