You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby修改XML音频文件名后无法保存新XML文件求助

问题分析与解决方案

你的问题出在没有将修改后的文本写回到XML节点中——你只是提取了文件名到一个数组并修改了数组内容,但原Nokogiri文档里的节点完全没被改动,所以保存后的XML自然没有变化。

看你的代码:

document.xpath("//sequence/media/audio/track/clipitem/file/name").map {|name| name.children.text }.map!{ |name| 'XX'+name}

这行代码做的是:

  1. 找到所有<name>节点
  2. 提取每个节点的文本内容,生成一个字符串数组
  3. 给数组里的每个字符串加上前缀"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:01:10