在Ruby中迭代XML的子节点的问题

时间:2015-07-23 09:44:32

标签: ruby xml nokogiri

我想在Ruby中遍历XML的主节点的子节点,但我得到的输出是不期望的。

这是我的XML:

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

我需要遍历&#34; sub&#34;:

的子节点
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

2 个答案:

答案 0 :(得分:2)

使用NOBLANKS解析选项。

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

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

答案 1 :(得分:1)

  

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

考虑这个简单的例子:

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;否则,浏览器或解析器不需要。

我们添加空格以使其对我们的眼睛更具可读性,但是用于缩进的嵌入式换行符和制表符/空格必须以某种方式计算,因此它们被视为文本节点。通常我们不关心,因为我们导航文档以查找特定节点及其嵌入内容方便地使我们绕过/超过“格式化节点”,但它们仍然存在并且它们对于文档的结构很重要。