gpt4 book ai didi

ruby - 如何遍历 Nokogiri XML DocumentFragment 中特定名称的子节点?

转载 作者:数据小太阳 更新时间:2023-10-29 01:44:53 25 4
gpt4 key购买 nike

在名为“string”的字符串中给定此 XML:

<Guide>
<Master>
<Part>12345</Part>
<Sub>
<Name>A</Name>
</Sub>
<Sub>
<Name>B</Name>
</Sub>
</Master>
<Master>
<Part>XYZABC</Part>
<Sub>
<Name>A</Name>
</Sub>
<Sub>
<Name>C</Name>
</Sub>
</Master>
</Guide>

这行代码:

bgdoc = Nokogiri::XML::DocumentFragment.parse(xstring.to_xml)

我想遍历所有名为“Part”的节点。

我尝试了以下方法:

bgdoc.xpath("//Part").each do |node|

和:

bgdoc.children.each do |node|
next unless node.name=="Part"

但这没有用。

最佳答案

问题是将 XML 解析为片段会返回部分 XML 文档,即 DocumentFragment,它没有根:

1.9.2-p290 :002 > doc = Nokogiri::XML::DocumentFragment.parse('<a><b>foo</b></a>').root
NoMethodError: undefined method `root' for #<Nokogiri::XML::DocumentFragment:0x00000100b34448>
from (irb):2
from /Users/greg/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `<main>'

而完整的 XML 文档确实有一个根:

1.9.2-p290 :003 > doc = Nokogiri::XML('<a><b>foo</b></a>').root
=> #<Nokogiri::XML::Element:0x8058b350 name="a" children=[#<Nokogiri::XML::Element:0x80587b10 name="b" children=[#<Nokogiri::XML::Text:0x80587818 "foo">]>]>

默认情况下,Nokogiri 将使用类似 //Path 的 XPath 从文档的根目录开始搜索:

1.9.2-p290 :004 > doc = Nokogiri::XML('<a><Path>foo</Path></a>').search('//Path')
=> [#<Nokogiri::XML::Element:0x8055465c name="Path" children=[#<Nokogiri::XML::Text:0x805543c8 "foo">]>]

但是由于缺少根,片段失败了:

1.9.2-p290 :005 > doc = Nokogiri::XML::DocumentFragment.parse('<a><Path>foo</Path></a>').search('//Path')
=> []

诀窍是告诉 Nokogiri 在处理片段时要看哪里。使用相对搜索或通配符:

1.9.2-p290 :006 > doc = Nokogiri::XML::DocumentFragment.parse('<a><Path>foo</Path></a>').search('.//Path')
=> [#<Nokogiri::XML::Element:0x8053c69c name="Path" children=[#<Nokogiri::XML::Text:0x8053c46c "foo">]>]

1.9.2-p290 :007 > doc = Nokogiri::XML::DocumentFragment.parse('<a><Path>foo</Path></a>').search('*//Path')
=> [#<Nokogiri::XML::Element:0x8052a208 name="Path" children=[#<Nokogiri::XML::Text:0x80529fec "foo">]>]

关于ruby - 如何遍历 Nokogiri XML DocumentFragment 中特定名称的子节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8552534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com