Ruby修改XML音频文件名后无法保存至新文件问题求助
Nokogiri修改XML文本后保存不生效的问题解决
你遇到的问题很典型——你只是修改了从XML里提取出来的文本数组,根本没把修改后的内容写回XML节点本身,所以保存后的文件还是原样。
咱们拆解下问题:
你的代码里这段:
document.xpath("//sequence/media/audio/track/clipitem/file/name").map {|name| name.children.text }.map!{ |name| 'XX'+name}
这里的map是把所有<name>节点的文本提取出来,生成了一个新的字符串数组,然后map!给每个字符串加了前缀。但这个数组和Nokogiri维护的XML文档对象完全没关系,IRB里显示的只是这个数组的结果,不是文档的实际状态。
修复方案
要真正修改XML内容,你需要遍历每个匹配到的节点,直接修改节点的文本内容:
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| # 获取原文本,加上前缀后赋值给节点的content属性 name_node.content = "XX#{name_node.text}" end File.open("new_test.xml", "w") do |f| f.write document.to_xml end
关键说明
- 用
each代替map:map是用来生成新集合的,而我们需要的是修改原节点对象,所以each遍历每个节点更合适 - 直接修改节点的
content(或text)属性:这个操作会直接修改Nokogiri文档对象里的内容,后续保存时自然会写入到新文件中
这样修改后,你再打开new_test.xml就能看到音频文件名已经加上XX前缀了。
内容的提问来源于stack exchange,提问作者cecileRx
相关产品推荐
相关产品推荐

