在Ruby中遍历XML子节点的问题



我想遍历Ruby中XML主节点的子节点,但是我得到的输出出乎意料。

这是我的XML:

<?xml version="1.0"?>
<main>
    <sub>
      <a></a>
      <b></b>
    </sub>
</main>

我需要遍历"sub"的子节点:

require 'nokogiri'
f = File.open('test.xml')
doc = Nokogiri::XML(f)
main_node = doc.xpath("//main/sub").first
subnode = main_node.children
subnode.each do |node|
    puts "#{node.name}"
end

我期望输出如下:

  a
  b
但是我得到的是
text
a
text
b
text

使用NOBLANKS解析选项

http://www.nokogiri.org/tutorials/parsing_an_html_xml_document.html parse_options

doc = Nokogiri::XML(f) do |config|
  config.noblanks
end

我不确定空白节点是如何插入的。

考虑这个简单的例子:

require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html><body><p></p></body></html>
EOT
doc.at('p').next_sibling # => nil
doc = Nokogiri::HTML(<<EOT)
<html>
  <body>
    <p></p>
  </body>
</html>
EOT
doc.at('p').next_sibling # => #<Nokogiri::XML::Text:0x3fde488b63b4 "n  ">
doc.at('p').next_sibling.to_html # => "n  "

在非格式化/非美化/压缩的HTML中,节点之间通常没有空白,除非它在文本中很重要或必须是语法正确的HTML;对于浏览器或解析器来说,它不是必需的。

我们添加空白是为了让我们的眼睛更容易阅读,但是嵌入的换行符和用于缩进的制表符/空格必须以某种方式加以说明,因此它们被视为文本节点。通常情况下,我们并不关心,因为我们在文档的导航中找到特定的节点和它们嵌入的内容,方便地带我们绕过"格式化节点",但它们仍然存在,它们对文档的结构很重要。

相关内容

  • 没有找到相关文章

最新更新