【问题标题】:Clarification of Nokogiri::NodeSet XML Content based on 'puts node' and 'puts node.inspect'基于 'puts node' 和 'puts node.inspect' 的 Nokogiri::NodeSet XML 内容的澄清
【发布时间】:2019-06-01 02:17:35
【问题描述】:

我很少使用 xpath(),但是当我使用时,我总是在解释 Nokogiri::Nodesets 的内容时绊倒自己,并且相信我现在知道我总是出错的地方。

简单地说,当我执行“puts NodeSet”时,我一直认为我可以根据返回的 XML 搜索 Nodeset。但是返回的第一个标签实际上并不是节点 XML 的一部分。

'puts n1' 返回具有 SPAN 作为 XML 的第一个元素的 XML,但是如果我随后进行搜索 n1.xpath('SPAN') 或 n1.xpath('SPAN/DIV') 则没有节点成立。 n1.xpath('DIV') 返回我期望的输出,并证明 XML 中没有 SPAN 标记。

我可以逻辑地向自己解释这一点的唯一方法是假设“放置节点”的第一个 xml 标记是“节点名称”而不是节点 XML 的一部分。这对我未来有用,但我是否错过了一些会在其他地方咬我的东西。

代码:

docxml = Nokogiri::XML(<<EOT)  
<DIV><SPAN><DIV id='1'><H1>-H1-</H1><h1>-h1-</h1></DIV>
<DIV id='2'><H2>-H2-</H2> <h2>-h2-</h2></DIV>
<DIV id='3'><H3>-H3-</H3><h3>-h3-</h3></DIV>
</SPAN></DIV>
EOT
n0 = docxml.xpath('DIV')
n1 = n0.xpath('SPAN')
n2 = n1.xpath('DIV') 
n3 = n2.xpath('*')
n4 = n3.xpath('*')  

puts "n1:xpath('SPAN'): \n#{n1.xpath('SPAN')}\n#{'^'*80}  \nn1 XML:\n#{n1}\n#{'^'*80}\
\nn1:inspect  \n#{n1.inspect}\n#{'^'*80}\n"
OUTPUT:
=begin
n1:xpath('SPAN'): 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
n1 XML:
<SPAN>
  <DIV id="1">    <H1>-H1-</H1>    <h1>-h1-</h1> </DIV>
  <DIV id="2">    <H2>-H2-</H2>    <h2>-h2-</h2> </DIV>
  <DIV id="3">    <H3>-H3-</H3>    <h3>-h3-</h3> </DIV>
</SPAN>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   
n1:inspect  
[#<Nokogiri::XML::Element:0x1c10964 name="SPAN" 
    children=[
        #<Nokogiri::XML::Element:0x1c10820 name="DIV" attributes=[#<Nokogiri::XML::Attr:0x18fff90 name="id" value="1">] 
            children=[#<Nokogiri::XML::Element:0x1c1064c name="H1" children=[#<Nokogiri::XML::Text:0x1c1ffe8 "-H1-">]>, 
                      #<Nokogiri::XML::Element:0x1c10604 name="h1" children=[#<Nokogiri::XML::Text:0x1c1fdcc "-h1-">]>
            ]>, 
        #<Nokogiri::XML::Element:0x1c107d8 name="DIV" attributes=[#<Nokogiri::XML::Attr:0x1c1fc10 name="id" value="2">] 
            children=[#<Nokogiri::XML::Element:0x1c105bc name="H2" children=[#<Nokogiri::XML::Text:0x1c1f874 "-H2-">]>, 
                      #<Nokogiri::XML::Text:0x1c1f778 " ">, 
                      #<Nokogiri::XML::Element:0x1c10574 name="h2" children=[#<Nokogiri::XML::Text:0x1c1f5f8 "-h2-">]
            >]>, 
        #<Nokogiri::XML::Element:0x1c10790 name="DIV" attributes=[#<Nokogiri::XML::Attr:0x1c1f43c name="id" value="3">] 
            children=[#<Nokogiri::XML::Element:0x1c1052c name="H3" children=[#<Nokogiri::XML::Text:0x1c1f0a0 "-H3-">]>, 
            #<Nokogiri::XML::Element:0x1c104e4 name="h3" children=[#<Nokogiri::XML::Text:0x1c1ee90 "-h3-">]
        >]            
  >]
>]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
=end

【问题讨论】:

  • 我 77 岁退休了,只在冬季(11 月至 3 月)进行编程(为了我自己的乐趣),所以每年都必须重新学习很多东西。文档不好,所以代码要理解,然后创建代码sn-ps,我以后可以参考。这是我的基本 xpath 代码 sn-p 的一部分,并希望确保我理解 NodeSet 内容,或者我的解释足够准确,可以始终毫无问题地使用。

标签: ruby xml xpath nokogiri


【解决方案1】:

现在我已经睡了,这对我有用。

'nodeset = xpath(tag1/tag2)' 返回一个包含成员节点'tag2'的'nodeset'

'puts nodeset'显示'tag2'节点成员

'nodeset.xpath('*')' 返回'tag2的内容

'nodeset.xpath('tag2')' 无效,因为 'tag2' 不是 'tag2' 内容的一部分

【讨论】:

    猜你喜欢
    • 2021-01-20
    • 2017-05-07
    • 1970-01-01
    • 2015-07-27
    • 2011-08-06
    • 1970-01-01
    • 2017-10-30
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多