2013-06-13 4 views
3

У меня есть базовый XML, который мне нужно изменить с помощью скрипта Ruby. XML выглядит следующим образом:Ruby/REXML: изменить значение тега из XPath

<?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?

ответ

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")) 
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> 
Смежные вопросы