ruby – 如何在Nokogiri XML DocumentFragment中迭代特定名称的
发布时间:2020-12-16 19:18:40 所属栏目:百科 来源:网络整理
导读:在名为“string”的字符串中给出这个 XML: Guide Master Part12345/Part Sub NameA/Name /Sub Sub NameB/Name /Sub /Master Master PartXYZABC/Part Sub NameA/Name /Sub Sub NameC/Name /Sub /Master/Guide 这行代码: bgdoc = Nokogiri::XML::DocumentFra
在名为“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,它没有root:
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">]>] 但由于缺少root,片段失败了: 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">]>] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |