gpt4 book ai didi

ruby - 使用 Ruby 编辑 XML

转载 作者:数据小太阳 更新时间:2023-10-29 01:47:06 25 4
gpt4 key购买 nike

我正在尝试编辑 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>'

最佳答案

你的问题是,当你应该寻找具有文本内容名称 old_A 的元素> 的 old_A

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

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 方法(如您定义的那样),那么您应该使用:

...content = generate_1 # no quotes

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

require 'rexml/document'    
doc = REXML::Document.new(xml)
REXML::XPath.first(doc,'//*[text()="old_A"]').text = 'generate_1'
REXML::XPath.first(doc,'//*[text()="old_B"]').text = 'generate_2'
REXML::XPath.first(doc,'//*[text()="old_C"]').text = 'generate_3'
puts doc
#=> <Standart-Profile>
#=> <class1>
#=> <class2>
#=> <class3>
#=> <value1>generate_1</value1>
#=> <value1>generate_2</value1>
#=> <value1>generate_3</value1>
#=> </class3>
#=> </class2>
#=> </class1>
#=> </Standart-Profile>

关于ruby - 使用 Ruby 编辑 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7989599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com