- ベストアンサー
XML::XPathでのタグの取り出し
- perlでXMLをHTMLとTEXTに変換するために、XPathを使用して同じタグの取り出しを試みていますが、うまくいきません。具体的には、<name>タグの中身を個別に取得したいのですが、どうすればよいでしょうか?
- perlの初心者ですが、XMLをHTMLとTEXTに変換するためにXPathを使用しています。しかし、同じタグの値を個別に取り出す方法が分かりません。特に<name>タグの値を取得したいのですが、どうすれば良いのでしょうか?
- perlでXMLをHTMLとTEXTに変換するためにXPathを使用していますが、<name>タグの値を個別に取得する方法が分かりません。どのようにすれば、<name>タグの中身を取得できるのでしょうか?お知恵をお貸しいただけると幸いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2> まず 指定されたXML にルートがありません。 >if($xpath->exists($jou){ 閉じカッコがありません。 >print "$xpath->findvalue($jou)\n"; のように全体を"" でくくったらちゃんと動作しないはずです。 print $xpath->findvalue($jou),"\n"; のような感じに修正下さい。 >print "$xpath->find('//jouhou/inigoukei/goutokuten')->get_node(1)\n"; 指定したパスが違っています。 そういう点を修正したものとして回答させていただくと my $node= $xpath->find('//jouhou/goukei/goutokuten')->get_node(1); の様にノードを取り出したら ノードのテキストを取り出すには $node->string_value のようにします。 分けないで $xpath->find('//jouhou/goukei/goutokuten')->get_node(1)->string_value の様にしても良いです。 ちなみに、#2のXMLの様な場合は パス指定を my $path = "//jouhou[1]/goukei/goutokuten"; のようにすれば $xpath->findvalue($path) あるいは、 $xpath->getNodeText($path) で同じデータが取り出せます。 質問文のように my $path = "//jouhou/goukei/goutokuten[1]"; と指定したら、 //jouhou/goukeiの下にある たくさんあるgoutokuten の最初という意味になって find では、 <goutokuten>3</goutokuten>←あるノード配下の最初のgoutokuten <goutokuten>4</goutokuten>←また別のノード配下の最初のgoutokuten が該当するリストということになります。
その他の回答 (3)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#3>もしルール違反なら、新しい質問としてあらためてさせていただきます。 おそらく、ルール違反と言うよりマナー違反 #3>このときの属性の"1回"を取得したいのですが、うまくいきません。 他にも指定の仕方はあると思いますが、#3の場合は以下のような感じでイイかと思います。 #1番目のten の属性 kai の内容を取得する print $xpath->findvalue('/root/ten[1]/@kai'),"\n"; #属性 kai が "1回" であるノードのテキストを取得する print $xpath->findvalue('/root/ten[@kai="1回"]'),"\n";
お礼
ルール違反をしたにもかかわらず、回答ありがとうございました。 この方法でやってみます。 お世話になりまして、本当に感謝します。 ありがとうございました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1>XML::XPath::Node::Element=REF(0x1f116c4) と出てきてしまい… #1の回答は、ノードを取り出すものです。 おそらく、表示するためのノードからのデータの取り出し方に問題がある(オブジェクトのままになっており、表示できるデータとして取り出せていない)と思います。 よろしければ、ご使用の実際のソースを補足下さい。
お礼
#4のお礼の続きです。 (ルール違反でなくて)マナー違反をしたにもかかわらず、回答ありがとうございました。 と、書きたかったのです…。 間違えてしまったのでこちらに書かせていただきました。 また、質問がありましたらよろしくお願いします。 ありがとうございました。 (BLUEPIXYさんが見てくれていると良いのですが。)
補足
たびたび回答ありがとうございます。 よろしくお願いします。 ------------------------------------------------------------------------- もとのXML文書です---data.xml <mei> <kyuujou>ドーム</kyuujou> </mei> <jouhou> <goukei> <goutokuten>3</goutokuten> </goukei> </jouhou> <jouhou> <goukei> <goutokuten>4</goutokuten> </goukei> </jouhou> ------------------------------------------------------------------------- $xpath = new XML::XPath( filename => "./data.xml" ); #XMLの中に1つしかないタグ<kyuujou>のときこれでやっていました。 my $jou = "//mei/kyuujou"; if($xpath->exists($jou){ print "$xpath->findvalue($jou)\n"; } #教えていただいたのをやってみたものです。すでに間違っているかもしれませんが…。 my $path = "//jouhou/goukei/goutokuten"; if($xpath->exists($path)){ print "$xpath->find('//jouhou/inigoukei/goutokuten')->get_node(1)\n"; } ------------------------------------------------------------------------- これを実行するとブラウザでは 「 ドーム XML::XPath::Node::Element=REF(0x1f039e4) 」と出てしまいました。 大変申し訳ございませんが、よろしくお願いします。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
my $node= $xp->find('/root/man/name')->get_node(1); で番号指定したノードを取り出せます。 (※番号は0始まりでなく1始まり)
補足
回答ありがとうございました。 試したところ、ブラウザに XML::XPath::Node::Element=REF(0x1f116c4) と出てきてしまい、いろいろ試したのですがやはり出てきません。 この場合、何が悪いのでしょうか? たびたび申し訳ございませんが、わかりましたら よろしくお願いします。
お礼
親切な回答ありがとうございます。 今度はうまくいきました!!
補足
大変お世話になりまして、ありがとうございます。 申し訳ございませんが、もう1つだけ質問させいただきたいのですが…。 もしルール違反なら、新しい質問としてあらためてさせていただきます。 --------------------------------------------------- <!-- XML文書(tensuu.xml) --> <root> <ten kai="1回">0</ten> <ten kai="2回">0</ten> <ten kai="3回">2</ten> <ten kai="4回">1</ten> : <!-- 本当はまだ続きます --> </root> --------------------------------------------------- このときの属性の"1回"を取得したいのですが、うまくいきません。 $xpath = new XML::XPath( filename => "tensuu.xml" ); #--(1)-- print $xpath->find('/root/ten/\@kai')->get_node(1)->string_value; #--(2)-- my $path = "//root/ten/\@kai[1]"; print $xpath->findvalue($path); タグと同じように試してみたのですが どちらでもエラーも出なく、無視された感じになりました。 ソースを見ると、これ以降の「 print "</p>"; 」なども出てきていません。 お手数をお掛けしますが、よければ教えていただきたいです。 よろしくお願いします。