37174


Ruby初心者です。よろしくお願いします。

現在Nokogiriを使用してXMLのパースに挑戦しています。

Xpathを使用して取得した結果から、さらにその下のノードを取得する場合はどのようにしたら良いのでしょうか？

以下のようなコードを書くと、本来specified_childrenにはnodeの中にある//*[contains(title,
'承諾')]で検索した結果から、さらに//contentで検索した結果が入るかと思うのですが、そうではなく、 **doc.xpath**
で絞り込みをした条件がいったんリセットされてしまい、 始めのXMLの状態から検索した結果が返ってきます。

[code]

    url = "http://example.xom" #urlからxmlを取得
    
    doc = Nokogiri::XML(open(url))
    
    doc.xpath("//*[contains(title, '承諾')]").each do |node|
      specified_children = node.at_xpath("//content")
    end
    
[/code]

つまり、XMLを//*[contains(title,
'承諾')]で検索した結果がリセットされ、//contentで検索した結果がすべて返って来てしまいます。

始めの絞り込み条件を維持したまま、その中のノードを検索・取得するためには、どのように書けば良いのでしょうか？

ご教授よろしくお願いいたします。


CC BY-SA 3.0
2017-08-11T08:29:20.767
37118
2017-08-14T02:37:12.013
2017-08-11T12:18:34.650
76
8682
question
ruby
Nokogiriを使用してXMLの特定のノードを取得する方法について


すみません、自己解決しました。

[code]

    specified_children = node.xpath("cotent")
    
[/code]

とピンポイントで指定すれば良かったようです。


CC BY-SA 3.0
2017-08-11T17:48:07.440
37127
2017-08-11T17:48:07.440
8682
37118
answer


自己解決したとのことですがちょっとわかりづらいので回答をつけておきます。

Nokogiri::XML::Documentから検索などで取り出したNokogiri::XML::Nodeに対してさらに検索を掛けた場合、検索条件が相対的な位置指定だった場合にそのノードが起点となる、という動きになります。Nokogiri::XML::Nodeが指すノードをルート要素として取り出したツリーに対して検索がおこなわれるわけではありません。

ですので、

[code]

    node = doc.at_xpath(...)
    node.at_xpath('//element') 
    
[/code]

これは

[code]

    doc.at_xpath('//element')
    
[/code]

と同じになってしまいます。

サブツリーに対して検索するには

[code]

    node = doc.at_xpath(...)
    node.at_xpath('.//element') 
    
[/code]

とします


CC BY-SA 3.0
2017-08-14T02:37:12.013
37174
2017-08-14T02:37:12.013
5793
37118
answer