XML::LibXMLのfindnodes()でワイルドカードを使った要素抜き出し方法を教えてください

このQ&Aのポイント
  • XML::LibXMLでXPathを使用してワイルドカードを指定して要素を抜き出したい場合、以下の方法があります。
  • 具体的な例として、XMLのid属性にワイルドカードを使用して、idが「1-」で始まる要素を抜き出す方法を説明します。
  • まず、XML::LibXMLでパーサーを作成し、parse_file()メソッドを使用してXMLを解析します。そして、XPathでワイルドカードを使用して要素を指定し、findnodes()メソッドを使用して要素を抜き出すことができます。
回答を見る
  • ベストアンサー

XML::LibXMLのfindnodes()で、ワイルドカードを使いたい

XML::LibXMLでXPathを使いたいのですが、 ワイルドカードの指定がうまくいきません。 要素名に*を当てはめたいのですが、、、、 例えば以下の通りです。 下記XMLのid="1-1"とid="1-2"を抜きだしたいのです。 できればXPathにて指定したいのですが、、、 教えてください。 my $dom = $parser->parse_file($xml_file_str) or die; $x = "//Test/TestText[@id="1-*"]/text()"; $c = $dom->findnodes($x); 解析対象XML <XML> <Test> <TestText id="1-1">テスト1</TestText> <TestText id="1-2">テスト2</TestText> <TestText id="2-1">テスト3</TestText> </Test> </XML>

  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

LibXMLを使っていないので間違っていたらすみません。 XPathでは、 ~の文字列で始まるというのは、 starts-with( ) 関数を使います id が '1-' で始めるノードは //TestText[starts-with(@id,'1-')] のように指定できます。 あと、蛇足ですが、 XML は予約語なので、XMLを要素名として使うことは規約違反です。

mhiro_december
質問者

お礼

ありがとうございます。 参考になりました。 ただ、XPath自体に変更を加えずに //Test/TestText[@id="1-*"]/text() を何とか処理したいのです。 XPath文が既にあり、それを使ってXMLを読みたい のです。 やはり、XML::LibXMLでは無理でしょうか、、、

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>XPath自体に変更を加えずに XPath自体には、正規表現は使えなかったと思います。 いったんセレクトしたノードリストをPerl のgrep で処理することはできると思いますけど。

mhiro_december
質問者

お礼

なるほど。ありがとうございます。 解決はしていませんが、この方法では行き詰るという ことが分かりました。

関連するQ&A

  • 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
  • xml_parseで実体参照が無視される

    phpでxmlをparseするコードを作成していますが、 動きが良く分からないものがあったので質問です。 以下のような、XMLがあります。 ・XML <a>1&lt;2<a> これを以下のようなPHPでparseします。 ・php function func_char($parser, $data){ print "char: $data\n"; } $parser = xml_parser_create(); xml_set_character_data_handler($parser , "func_char"); xml_parse($parser, "<a>1&lt;2<a>"); 出力が以下のようになります。 ・出力結果  char: 1  char: 2 間に"char: <"が出力されるかと思ったのですが、出力されません。 何か心当たりのある方はいらっしゃいますでしょうか? 実行環境 ---------------------- OS:CentOS 5.2 Apache 2.2.9 php 5.2.6 libxml2 2.7.2 ----------------------

    • 締切済み
    • PHP
  • c++でxpath指定でXML

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

  • xml_parse_into_structを使うと、xmlの中のCDATAが消える

    XMLデータを取得するプログラムをPHP5で製作しています。 以下、コーディング ----------------------------------------------------------- $contents = file_get_contents($restURL); $parser = xml_parser_create('UTF-8'); xml_parse_into_struct($parser,$contents,$values); xml_parser_free($parser); ----------------------------------------------------------- file_get_contentsでXMLデータの取得した時点では、例えば  <img><![CDATA[<hogehoge>]]></img> というふうにCDATAが格納されていることは確認できています。 しかし、xml_parse_into_structで配列構造体にXMLデータを格納すると、   [0] => Array ( [tag] => IMG [type] => complete [level] => 4 [value] => ) という感じに、"value"の中の値が空になってしまいます。 xml_parse_into_structで"CDATA"が消えずに配列構造体される方法、 または、xml_parse_into_struct以外で"CDATA"が消えずに配列構造体に 設定される手法はありますでしょうか。

    • ベストアンサー
    • PHP
  • XPathでのワイルドカード指定

    改めて質問させていただきます。 XPathで、 //Test/TestText[id="1-*"]/text() といった指定をしたいのですが、こういった 指定方法は、XPathとして正しい書き方なのでしょうか? このXPath式が与えられ、これを使ってXMLを解析 したいのですが、もしこの記法がNGの場合、 変換を加えてワイルドカードを実現したいと思います。 どのようなアプローチがベストか、教えて頂けないで しょうか? #使用言語はperlです。

  • Java ファイルオブジェクトでなく文字列オブジェクト?

    JavaでXMLをパースするプログラムを初めて試しています。 parseメソッドの第一引数がファイルオブジェクトなのですが、これをメモリ(文字列)オブジェクトを与えて同じ動作させるものはあるのでしょうか? // SAXパーサーファクトリを生成 SAXParserFactory spfactory = SAXParserFactory.newInstance(); // SAXパーサーを生成 SAXParser parser = spfactory.newSAXParser(); // XMLファイルを指定されたデフォルトハンドラーで処理します parser.parse(new File("helloworld.xml"), new InsXMLParser()); ※このように String str = "<xml? ......"; parser.XXXXXX(str, new InsXMLParser

    • ベストアンサー
    • XML
  • DOMでパースしているXML全体の出力方法

    お世話になります。 JavaでDOMを使ってXML操作をしたいと考えております。 おおよそ、以下のソースでparseできるところまで確認できました。 DOMParser parser = new DOMParser(); parser.parse("XMLファイルパス"); Document doc = parser.getDocument(); 開発中なので、DOM操作した結果のXMLを随時コンソールやログに 出力させたいのですが、たとえばdoc.toString()してもnullとなり、 正常に出力されません。 以下のようにElementを取得すると正常にアクセスできていることは 確認しています。 Element rootEl = doc.getDocumentElement(); System.out.println(rootEl.getNodeName()); なお、DOMライブラリにはxercesを用いております。 Dom4jのAPIも見てみましたが、それらしいメソッドを見つけることが できていません。 簡単にXMLを出力できることが理想です。 一般的な方法、よくやる手法など、みなさんよりご教示頂きたいです。

    • ベストアンサー
    • Java
  • xml_parse_into_structでなぜか0が返ります

    http://iac-npo.de-blog.jp/yamazaki/atom.xml 上記のアドレスは、あるプロ野球選手のブログのRSSです(atom形式)。 これをxml_parse_into_structを使い、配列構造体に格納しようと考えています。 しかし、なぜか返り値は0。配列は当然カラです。 XMLについては文字コードはUTF8ですし、構造もきちんとしているように見えます。 何が原因なのでしょうか? ソースは以下の通りです。 $content=file_get_contents('http://iac-npo.de-blog.jp/yamazaki/atom.xml'); $xml_parser=xml_parser_create(); xml_parse_into_struct($xml_parser,$content,$vals); xml_parser_free($xml_parser);

    • ベストアンサー
    • PHP
  • Perl での XML 置換について

    perl で XML::LibXML モジュールを使用して下記のようなXMLのテキスト部分の置換をしようとしています。 <item id="1"> <name>hoge</name> <description> テスト<b>テスト</b>テスト </description> </item> <item id="2"> <name>hoge2</name> <description> テスト2<i>テスト2</i>テスト2 </description> </item> これに対して、 for $node ($dom->findnodes('//item/description/text()')){ $text = $node->toString; $text =~ s/.../.../; $node->setData($text); } のように置換する処理を考えたのですが、description の中に <b> や <i> のようなインライン要素があると正しく置換、書き戻しがされません(置換対象は、これらインライン要素の中にも外にもあります)。 これをなんとか正常に動作させる方法はあるでしょうか。 どうぞ、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 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

専門家に質問してみよう