• ベストアンサー

xpath でn番目のテキストノード取得

xpathで//text()とするとすべてのテキストノードが取得できますが、 この中からn番目のテキストノードを取得することは可能でしょうか? (プログラムでループではなく、xpathで。) <?xml version='1.0'?> <root><foo>aaa</foo><bar>bbb</bar><buz>bbb</buz></root> //text()[1]でaaaがとれるかと思ったんですが。。。 よろしくお願いします。

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

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

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

仕様自体がそうなのか自信ありませんが, とりあえず手元のXMLEDITOR.NETでは (//text())[1]とか(//text())[2]で aaaやbbbが取得できています。 #//text()[1]と書くと //(text()[1])という計算をするみたいです。

momruru
質問者

お礼

ご回答、ありがとうございます。 まさに求めていたものです。 まさかカッコとは。。。演算子の基本でしたね。 情けない。。。 ありがとうございました。

その他の回答 (1)

  • nadera
  • ベストアンサー率83% (5/6)
回答No.1

//*[1]/text() で,どうですか?

momruru
質問者

補足

ご回答、ありがとうございます。 すいません、説明不足+例文が悪かったです。 解析対象が例文のように1階層であれば教えていただいたxpathで可能ですが、 階層が不規則な場合だと、xpathのみで取得というのは無理でしょうかね? あくまで//text()で取得した中でのn番目という意味で。 いずれにしても、//*[1]は思いつかなかったので、参考になりました。 ありがとうございます。

関連するQ&A

  • 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 -- 追加したノードが見付からない

    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
  • JavaScriptでXPath

    こんにちは、教えてください。 これまでVC#やVBでXMLを扱っていましたが、その際にはXPathでノードの参照することが多かったです。 今JavaScriptをやむなくいじっているのですが、JavaScriptで動的に生成したXHTMLをXPathで参照したいのですが、これは可能でしょうか? getElementByIdやgetElementsByTagName、ChildNodeなどDomでの操作用の関数がいくつかありますが、参照はこれでもいいのですが、ノードの追加や属性、テキストの追加などをやっていると、ちょっと物足りません。というかXPathが使いたいのです。どう考えてもXPathは楽です。 できるならやりたいのですが、ご存知であれば教えてください。

  • テキストノードの文字列に一致した要素の取得(xPath

    xml,xslを勉強しているのですが、xPathの指定が上手く定義できない状態です。ご教授の程お願い致します。 下記がxml,xslです <!-- アーティスト名とタイトルを明記したxml --> -- music.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="music.xsl"?> <music> <artist> Ciel <title>wake</title> </artist> <artist> Flew <title>BANG</title> </artist> <artist> cobu                 // (1) <title>calling</title> </artist> <artist> cobukure <title>dammy</title> </artist> </music> <!-- 条件に一致したアーティスト名、タイトルを表示するxsl --> -- music.xsl <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head><title></title></head> <body> <xsl:for-each select = "descendant::artist[contains(text(),'cobu')]"> // (2) <xsl:value-of select ="text()" />: <xsl:value-of select ="title" /><br/> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet> //上記の処理結果 cobu :calling cobukure :dammy //希望する処理結果 cobu :calling ・質問内容 XMLのartistのテキストノード=cobuをxsl:for-eachでselectして、 titleのcallingを表示したい 本、サイトなどで調べて、 descendant::artist[contains(text(),'cobu')]のxPathまでは、 導けたのですが、この場合は、cobuを含むので、 artistのテキストノード=cobukureもselectされdummyが表示されてしまいます。 処理結果、 cobu :callingのみselectできるxPathの定義をご教授の程お願い致します

    • ベストアンサー
    • XML
  • 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
  • XML::Xpathで部分一致検索をするには

    $xpath->find('/foo/bar/text()="hoge"'); のようにパスと内容から検索は出来るのですが、 完全一致しか取得することができません。 部分一致、もしくは正規表現を用いることは出来るのでしょうか?

  • XPATHについて

    現在if文でカレント(AAA)以降のすべての兄弟要素の要素名のなかにAAAが存在するかを調べたいのですがどのようなif文にすればいいのでしょうか? <xsl:if test="name(?????='AAA')"></xsl:if> sample.xml <root> <AAA/>※カレント <BBB/> <CCC/> <AAA/> </root>

    • 締切済み
    • XML
  • 改行がノード?(JAXP)

    xmlのノードについてですが、 <talkset> <name type="first">abc</name> <comment>hello!!</comment> </talkset> というxmlファイルがあった場合に、 JAXPでの、getNodeList()で全てのノードリストを 得ます(mynodelist=root.getNodeList())。 ここで、mynodelist.item(i)として、 上から、ノードを見ていくプログラムを作ったの ですが、 まず、最初にテキストノード(<talkset>の横の改行) 、次に<name>ノードがきて、次にテキストノード( </name>の横の改行?)が取り出されます。 この場合、本来、<name>ノードの後は属性ノードである type、次に、テキストノード(abc)そしてその後に、 改行(テキストノード)が取り出されるべきだと思う のですが、そうなりません(type属性と、abcが、 ノードとして、取り出せない)。 なにか分かる人、お願いします。

    • ベストアンサー
    • XML
  • XMLでノード内にあるIDを取得してそのIDが含まれるノード内の内容を

    XMLでノード内にあるIDを取得してそのIDが含まれるノード内の内容を反映させる にはどうしたらいいでしょうか? XMLは以下のような感じです。 <?xml version="1.0" encoding="UTF-8"?> <top> <menu> <pid>1</pid> //これをIDとして <test>テスト</test> <test2>msn</test2> </menu> <menu> <pid>2</pid> <test>テストにしたのに…</test> <test2>教えてごお</test2> </menu> <menu> <pid>3</pid> <test>テスト</test> <test2>yahoo</test2> </menu> </top> 私はアクションスクリプトでxmlを読み込んでfirstChild やnextSiblingが使える程度のレベルです。 nextSiblingで上から順番にノードを取得していくことはできますが、 ”あるIDを取得してそのIDがある内容(<test>,<test2>)を反映させる” というところでつまずいています。 最悪はIDを取得しなくても ”?番目の<menu>を取得する” という取得の仕方でもいいです。 (<pid>と?番目は同じなので) あるいは ”<menu id="1">の属性を取得して反映させる” という方法の方が簡単ならばXMLの変更も可能な状態です。

    • ベストアンサー
    • Flash
  • 不特定ノードに出現する同じタグ要素の中身を置換して保存したい

    ある特定のタグ要素(例:hoge)がXML内のどこに現われるかわからないとき、それらの要素の中身を置換して、元のXMLと同じ構造を保ったまま保存したいと考えています。 XPathを使って//hogeと指定すればnodeListが抽出できますが、それらのrootNodeからの絶対パスを知る方法があればよいのですが。。。 当方DOMとXSLTを多少かじった程度で、SAXについては全くわかりませんが、どんな方法でもよいので実現できる方法があったらどなたかご教授くださいませ。 <?xml version="1.0" encoding="Shift_JIS"?> <root>  <hoge>変換前文字列1</hoge>  <aaa>   <hoge>変換前文字列2</hoge>  </aaa>  <bbb>   <ccc>    <hoge>変換前文字列3</hoge>   </ccc>   <hoge>変換前文字列4</hoge>   <hoge>変換前文字列5</hoge>  </bbb> </root> 上記のようなXMLを下記のように変更したい。 <?xml version="1.0" encoding="Shift_JIS"?> <root>  <hoge>変換後文字列1</hoge>  <aaa>   <hoge>変換後文字列2</hoge>  </aaa>  <bbb>   <ccc>    <hoge>変換後文字列3</hoge>   </ccc>   <hoge>変換後文字列4</hoge>   <hoge>変換後文字列5</hoge>  </bbb> </root>

    • ベストアンサー
    • XML

専門家に質問してみよう