0

我来自 C 背景,但在 Ruby 中研究一些与 XML 相关的东西,所以,如果我的问题很幼稚,请多多包涵。

我有一个 XML 文档。我正在使用 libxml 解析它:

<test>
 <ready>
  <ex_success>true</ex_success>
 </ready>
 <ath>
  <name>abc</name>
  <pass>123</pass>
  <ex_success>true</ex_success>
 </ath>
</test>

在本文档中,我能够阅读该ex_success元素。但是,我无法从我的原始文件中删除它。

这是我的一小段代码:

require 'xml'
test_file = @file_name
parser = XML::Parser.file(test_file)
document = parser.parse

document.root.each_element {|element|

  # Write each element name in the file
  puts 'element.name'

  if val = element.find_first('ex_success')   
    puts val.content   # prints true
    val.remove!    # THIS line does not remove the element from my original file

  else
    puts 'Not found'
  end

我做错了什么,删除它的正确方法是什么?

4

1 回答 1

2

我建议不要使用 libxml。虽然它是 Ruby 的一部分,但它并不是 Ruby 的 XML 解析的事实上的标准。Nokogiri是。

这是我使用 Nokogiri 的方法:

require 'nokogiri'

doc = Nokogiri::XML::DocumentFragment.parse(<<EOT)
<test>
 <ready>
  <ex_success>true</ex_success>
 </ready>
 <ath>
  <name>abc</name>
  <pass>123</pass>
  <ex_success>true</ex_success>
 </ath>
</test>
EOT

ex_success = doc.at('ex_success')
ex_success_value = ex_success.text # !> assigned but unused variable - ex_success_value
ex_success.remove

puts doc.to_xml
# >> <test>
# >>  <ready>
# >>   
# >>  </ready>
# >>  <ath>
# >>   <name>abc</name>
# >>   <pass>123</pass>
# >>   <ex_success>true</ex_success>
# >>  </ath>
# >> </test>

如果您不希望空文本节点留下空白行,请使用以下命令:

ex_success = doc.at('ex_success')
ex_success_value = ex_success.text # => "true"
ex_success.parent.children.remove

puts doc.to_xml
# >> <test>
# >>  <ready/>
# >>  <ath>
# >>   <name>abc</name>
# >>   <pass>123</pass>
# >>   <ex_success>true</ex_success>
# >>  </ath>
# >> </test>

我使用Nokogiri::XML::DocumentFragment.parse了 ,它按原样接受 XML 片段。更常见的是使用Nokogiri::XML(<<EOT),如果 XML decl 不存在,它将添加它。

于 2014-08-07T21:58:35.813 回答