• 締切済み

XPathでのワイルドカード指定

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

  • Perl
  • 回答数1
  • ありがとう数0

みんなの回答

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

>指定方法は、XPathとして正しい書き方なのでしょうか? XPath としては、正しいですが <TEST id="1-*" /> のノードを表すことになります。

関連するQ&A

  • 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
  • XML::XPathで日本語検索するには

    XML::XPathを用いてやりたいことはほぼ実現できたのですが、 いざ実装しようとしたところで最も大きな問題にぶつかってしまいました。 日本語で検索できないのです。 $xml->find('/list/item[text()="りんご"]'); エラーにはなりませんが、合致するはずのノードが出てきません。 http://kentn.at.infoseek.co.jp/xml/perl_xpath.html ↑のページを見ると対処法はあるようなのですが、 XML/XPath.pm を修正しても以下のようなエラーが表示されます。 ------------------ Query: /list/ite... ^^^ Invalid query somewhere around here (I think) ------------------ XML::XPathで日本語を扱っている方がいましたら 対処法を教えていただけませんでしょうか。 また、XML::XPath::find()で正規表現を使うことは できないのでしょうか。

    • ベストアンサー
    • Perl
  • 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
  • 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::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
  • XPathの関数「text()="value"」のダブルコーテーションをエスケープする方法は?

    お世話になります。 現在、XPathに関するプログラムを制作しています。 入力されたXPathを解析し、解析した内容に応じて特定の処理をさせるというものなのですが、text() 関数の解析で躓いています。 text()="value" ここまではわかります。 text()='value1"value2\value3' 上のケースでは、どのように記述すればいいのでしょうか? シングルコーテーションで括るという解では、シングルコーテーションとダブルコーテーションが混在している場合に対応できません。 そのプログラムではクオート文字をダブルコーテーションに限定しているので、ダブルコーテーションのエスケープ方法を探しています。 現在はバックスラッシュ(\)によるエスケープ処理で対応しています。 text()="value1\"value2\\value3" しかし、Firefox拡張「XPath Checker」で調べるとバックスラッシュによるエスケープ処理は働いていないため、 この方法は正しくない気がしています。 プログラムとしては問題なく動作していますが、XPath記法に沿っていないのは落ち着きません。 何かヒントとなる情報はないでしょうか?

    • ベストアンサー
    • XML
  • XML::XPath でXMLを修正して出力するには?

    XML::XPath を使って以下のようなソースを書きましたが、出力の方法がわかりません。 ++++++++++++++++ use strict; use XML::XPath; my $filename = "test.html"; my $xp = XML::XPath->new(filename=>$filename); my @nodeset = $xp->findnodes("//div[attribute::class='center']//img[attribute::class='right'"); for my $node ( @nodeset ){ print $node->removeAttribute('class'), "\n"; } print $xp; 1; ++++++++++++++++++++++++++++ 最後の print $xp のところで、修正後のXMLを出力したいです。 修正後のXMLをテキストとして出力(変数に入れるでも、標準出力でも)するには、どうすればよいのでしょうか?

    • ベストアンサー
    • Perl
  • php5のxpathで結果を連想配列で得るには?

    こんにちは。xpathの結果を連想配列で取得したいのですが、どうすればよいのかわかりません。 ソースは foreach($xml->xpath("/aaa/bbb_id[@id='1']/*") as $key => $value) { $array['$key'] = $value; } という感じで、指定したidの中に存在する子エレメント全て取得しています。 が、$keyは0,1,2...と数字で返ってきてしまいます。 そうではなくて、例えば <aaa> <bbb_id id=1> <hoge>value</hoge> </bbb_id> </aaa> で、"value"を取得したら$keyにはhogeが入ってほしいのですが、どのように書けばいいのでしょうか?

    • ベストアンサー
    • PHP
  • Rubyにおける、XPathの関数「text()="x"」への変数の使

    Rubyにおける、XPathの関数「text()="x"」への変数の使用方法 お世話になります。 RubyにてXPathの関数「text()="x"」"x"の部分に変数を使用したいと思い、コードを作成しています。 text() 関数のところで困っています。 例えば <?xml version="1.0" encoding="UTF-16"?> <NameRoot> <Text> <Name>あああああ</Name> <No>001</No> </Text> <Text> <Name>いいいいい</Name> <No>002</No> </Text> <Text> <Name>ううううう</Name> <No>003</No> </Text> </NameRoot> の内容のファイルを読み込み、その中から該当するNoに相当するNameを取得しようと しています。 で、書いたのが下記のような内容なのですが、gettestクラスのgetNameメソッドにて コメントアウトしてある行であれば、決め打ちでNo="001"の物を取ってこれるのですが、 ここに引数として渡されたローカル変数の、idを使用しようとするとnode変数にNilClass が返ってきて取得できません。 文字列リテラルを色々調べてみたのですが、どうも上手く行かず困っています。 他愛も無い質問かもしれませんが、大変困っています。 どなたか知恵をお貸しくださいますようお願い致します。 class gettest def getName(id) #↓これがきちんと動きません node = REXML::XPath.first(@masterdata, '//NameRoot/Text/No[text()="#{id}")]') #↓こちらは当然ながら動きます # node = REXML::XPath.first(@masterdata, '//NameRoot/Text/No[text()="001"]') path = (node.xpath + "/../Name") @name = @masterdata.elements[path].text() end end class main def edit @mastername = "" @mastername = @master.getName("001") print @mastername end end

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