Разъяснение XML-контента Nokogiri :: NodeSet, основанного на «ставит узел» и «ставит узел.инспект» - PullRequest
0 голосов
/ 06 января 2019

Я редко использую xpath (), но когда я делаю это, я все время путаюсь в интерпретации содержания Nokogiri :: Nodesets и верю, что теперь я знаю, где я всегда ошибался.

Проще говоря, когда я делаю 'Put NodeSet', я всегда предполагал, что могу искать Nodeset на основе возвращенного XML. Но первый возвращенный тег не является частью XML-узла.

«put n1» возвращает XML, в котором SPAN является первым элементом XML, но если я затем выполню поиск n1.xpath («SPAN») или n1.xpath («SPAN / DIV»), ни один узел не будет найденный. n1.xpath ('DIV') возвращает ожидаемый вывод и доказывает отсутствие тега SPAN в XML.

Единственный способ логически объяснить это самому себе, если предположить, что первый 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

1 Ответ

0 голосов
/ 06 января 2019

Теперь, когда я немного поспал, это работает для меня.

'nodeset = xpath (tag1 / tag2)' возвращает 'nodeset', содержащий элемент-член 'tag2'

«устанавливает узел» отображает элемент узла «tag2»

'nodeset.xpath (' * ')' возвращает содержимое тега2

'nodeset.xpath (' tag2 ')' недопустим, поскольку «tag2» не является частью содержимого «tag2»

...