Ruby / REXML:从XPath更改标记值

时间:2013-06-13 09:45:37

标签: ruby xpath rexml

我有一个基本XML,我需要通过Ruby脚本进行修改。 XML看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
    <config>
        <name>So and So</name>
    </config>

我可以打印<name>

的值
require 'rexml/document'
include REXML

xmlfile = File.new("some.xml")
xmldoc = Document.new(xmlfile)

name = XPath.first(xmldoc, "/config/name")
p name.text # => So and so

我想要做的是通过别的东西改变值(“如此”)。我似乎无法找到该用例的任何示例(在文档中或其他方面)。甚至可以在Ruby 1.9.3中做到吗?

2 个答案:

答案 0 :(得分:4)

使用Chris Heald回答我设法用REXML做到了这一点 - 不需要Nokogiri。诀窍是使用XPath.each而不是XPath.first。

这有效:

require 'rexml/document'
include REXML

xmlfile = File.new("some.xml")
xmldoc = Document.new(xmlfile)

XPath.each(xmldoc, "/config/name") do|node|
  p node.text # => So and so
  node.text = 'Something else'
  p node.text # => Something else
end

xmldoc.write(File.open("somexml", "w"))

答案 1 :(得分:3)

我不确定rexml是否会这样做,但我一般建议不要使用rexml。

Nokogiri做得很好:

require 'nokogiri'

xmldoc = Nokogiri::XML(DATA)
xmldoc.search("/config/name").each do |node|
  node.content = "foobar"
end

puts xmldoc.to_xml

__END__
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <name>So and So</name>
</config>

结果输出:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <name>foobar</name>
</config>