gpt4 book ai didi

ruby - 如何使用 Nokogiri 替换 XML 节点内容

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

我正在使用 Ruby 读取 XML 文档并使用新值更新单个节点(如果存在)。

http://www.nokogiri.org/tutorials/modifying_an_html_xml_document.html对我来说如何更改节点数据并不明显,更不用说如何将它保存回文件了。

def ammend_parent_xml(folder, target_file, new_file)
# open parent XML file that contains file reference
get_xml_files = Dir.glob("#{@target_folder}/#{folder}/*.xml").sort.select {|f| !File.directory? f}
get_xml_files.each { |xml|

f = File.open(xml)

# Use Nokgiri to read the file into an XML object
doc = Nokogiri::XML(f)
filename = doc.xpath('//Route//To//Node//FileName')

filename.each_with_index {
|fl, i|
if target_file == fl.text
# we found the file, now rename it to new_file
# ???????
end

}

}

end

这是一些示例 XML:

<?xml version="1.0" encoding="utf-8">
<my_id>123</my_id>
<Route>
<To>
<Node>
<Filename>file1.txt</Filename>
<Filename>file2.mp3</Filename>
<Filename>file3.doc</Filename>
<Filename>file4.php</Filename>
<Filename>file5.jpg</Filename>
</Node>
</To>
</Route>
</xml>

我想将“file3.doc”更改为“file3_new.html”。

我会调用:

def ammend_parent_xml("folder_location", "file3.doc", "file3_new.html")

最佳答案

更改 XML 中的元素:

@doc = Nokogiri::XML::DocumentFragment.parse <<-EOXML
<body>
<h1>OLD_CONTENT</h1>
<div>blah</div>
</body>
EOXML


h1 = @doc.at_xpath "body/h1"
h1.content = "NEW_CONTENT"

puts @doc.to_xml #h1 will be NEW_CONTENT

保存 XML:

file = File.new("xml_file.xml", "wb")
file.write(@doc)
file.close

您的示例 XML 有一些问题。

  • 有两个根元素my_idRoute
  • 缺少?在第一个标签中
  • 你需要最后一行吗 </xml>

修复示例后,我可以使用 Phrogz 的示例获取元素:

element = @doc.xpath("Route//To//Node//Filename[.='#{target_file}']").first 

备注.first因为它将返回一个 NodeSet。

然后我会更新内容:

element.content = "foobar"

关于ruby - 如何使用 Nokogiri 替换 XML 节点内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28627021/

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