使用Ruby编辑XML

时间:2011-11-03 02:20:14

标签: ruby xml

我正在尝试编辑XML文件并用ruby变量替换字符串。 现在这是我的代码:

<?xml version="1.0" encoding="US-ASCII"?>
<Standart-Profile>
    <class1>
        <class2>
            <class3>
               <value1>old_A</value2>
               <value1>old_B</value2>
               <value1>old_C</value2>
            </class3>
        </class2>
    </class1>
</Standart-Profile>

这是Ruby文件:

require "rexml/text"
require 'rexml/document'
include REXML

def generate_2
    ...
end

def generate_1
    ...
end


File.open('Standart-Profile.xml') do |config_file|
  config = Document.new(config_file)
  config.root.elements['old_A'].text = 'generate_1'
  config.root.elements['old_B'].text = 'generate_2'
  config.root.elements['old_C'].text = 'generate_1'

  formatter = REXML::Formatters::Default.new
  File.open('New-Profile.xml', 'w') do |result|
  formatter.write(config, result)
  end
end

但我一直收到这个错误:

Final-Tool-Kit.rb:19:in `block in <main>': undefined method `text=' for nil:NilC
lass (NoMethodError)
        from test.rb:16:in `open'
        from test.rb:16:in `<main>'

1 个答案:

答案 0 :(得分:11)

您的问题是,当您要查找包含{em>文本内容的元素时,您正在寻找带有名称 old_A的元素{1}}。

这是使用Nokogiri的解决方案,我发现它比REXML更方便:

old_A

如果您确实想要调用require 'nokogiri' # gem install nokogiri xml = "<Standart-Profile> <class1> <class2> <class3> <value1>old_A</value2> <value1>old_B</value2> <value1>old_C</value2> </class3> </class2> </class1> </Standart-Profile>" doc = Nokogiri.XML(xml) doc.at('//text()[.="old_A"]').content = 'generate_1' doc.at('//text()[.="old_B"]').content = 'generate_2' doc.at('//text()[.="old_C"]').content = 'generate_3' File.open('output.xml','w') do |f| f.puts doc end #=> <?xml version="1.0" encoding="US-ASCII"?> #=> <Standart-Profile> #=> <class1> #=> <class2> #=> <class3> #=> <value1>generate_1</value1> #=> <value1>generate_2</value1> #=> <value1>generate_3</value1> #=> </class3> #=> </class2> #=> </class1> #=> </Standart-Profile> 方法(如您所定义的那样),那么您可以使用:

generate_1

编辑:这是在REXML中使用XPath执行此操作的一种方法(在我将源XML修复为有效之后):

...content = generate_1 # no quotes