Ruby修改XML音频文件名后无法保存新XML文件求助
问题分析与解决方案
你的问题出在没有将修改后的文本写回到XML节点中——你只是提取了文件名到一个数组并修改了数组内容,但原Nokogiri文档里的节点完全没被改动,所以保存后的XML自然没有变化。
看你的代码:
document.xpath("//sequence/media/audio/track/clipitem/file/name").map {|name| name.children.text }.map!{ |name| 'XX'+name}
这行代码做的是:
- 找到所有
<name>节点 - 提取每个节点的文本内容,生成一个字符串数组
- 给数组里的每个字符串加上前缀"XX"
但这个修改只停留在数组里,和原XML文档的节点没有任何关联。
修正后的代码
你需要遍历每个<name>节点,直接修改节点的文本内容:
require 'nokogiri' file = File.read('man_142_test.xml') document = Nokogiri::XML(file) # 遍历每个name节点,直接修改其文本内容 document.xpath("//sequence/media/audio/track/clipitem/file/name").each do |name_node| original_name = name_node.text name_node.content = "XX#{original_name}" end File.open("new_test.xml", "w") do |f| f.write document.to_xml end
为什么这样有效?
name_node.text获取节点的当前文本内容name_node.content = "XX#{original_name}"直接修改该节点的内容,这个修改会同步到Nokogiri的document对象中- 最后保存
document.to_xml时,修改后的内容就会被写入新文件
验证方法
你可以在修改后添加一行代码验证节点内容是否真的改变了:
document.xpath("//sequence/media/audio/track/clipitem/file/name").each do |node| puts node.text # 应该输出带XX前缀的文件名 end
这样运行后,生成的new_test.xml里的<name>节点内容就会是修改后的带前缀文件名了。
内容的提问来源于stack exchange,提问作者cecileRx
相关产品推荐
相关产品推荐

