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

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

相关产品推荐
方舟 Agent Plan

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

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