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



给定这个XML在字符串"string"中:

<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">]>] 
bgdoc = Nokogiri::XML::DocumentFragment.parse(<<EOF)
  <xml stuff>
EOF
bgdoc.xpath(".//Part").each do |node|
  # some instruction
end

如果您确实只有一个字符串,则只需使用Nokogiri:XML进行解析:

bgdoc = Nokogiri::XML.parse(string)

将为您提供一个根,您可以根据需要使用xpath //Part

bgdoc.css("Part")

相关内容

  • 没有找到相关文章

最新更新