XML文档字符串转小写及数组词汇替换的自动化实现求助
解决方案
核心问题分析
你的代码存在几个关键问题导致功能无法正常工作:
- 替换数组采用二维数组结构,匹配逻辑依赖索引对应,无法灵活处理字符串中的任意目标词
- 替换逻辑错误:判断整个字符串等于
wordReplacement[i],而非查找字符串内的目标词进行替换 - 未处理XML中单个
<string>标签的情况(此时resources会是对象而非数组) - 未启用转小写逻辑,也未使用预设的前缀/后缀数组
修复后的完整代码
const fs = require("fs") const xmlParser = require("xml2json") const formatXml = require("xml-formatter") // 重构替换映射为键值对,更高效易用 const replacementMap = { "what": "wat", "yes": "ye", "please": "pls", "thanks": "thx", "because": "cuz", "easy": "ez", "good": "gud", "this": "dis", "that": "dat", "them": "dem", "ok": "okie", "you": "u", "ll": "ll", "telegram": "meowgram" }; const startReplacement = [ "uwaaa! ", "ugu, ", "rawr " ] const endReplacement = [ " OwO", " UwU", " :3", " xD", " <3", " o.o", " >w<", " wyaaaa" ] fs.readFile("./dataMain.xml", function(err, data) { if (err) { console.error("读取文件失败:", err); return; } const xmlObj = xmlParser.toJson(data, {reversible: true, object: true}) let resources = xmlObj["resources"]["string"] // 处理单个<string>标签的情况,转为数组统一处理 if (!Array.isArray(resources)) { resources = [resources]; } for (let i = 0; i < resources.length; i++) { if (resources[i]?.$t) { let text = resources[i].$t.toLowerCase(); // 转为小写 // 遍历替换映射,用正则匹配完整单词进行全局替换 Object.entries(replacementMap).forEach(([original, replacement]) => { const regex = new RegExp(`\\b${original}\\b`, "g"); text = text.replace(regex, replacement); }); // 随机添加前缀和后缀 const randomStart = startReplacement[Math.floor(Math.random() * startReplacement.length)]; const randomEnd = endReplacement[Math.floor(Math.random() * endReplacement.length)]; text = randomStart + text + randomEnd; // 更新回原对象 xmlObj["resources"]["string"][i].$t = text; } } const stringifiedXmlObj = JSON.stringify(xmlObj) const finalXml = xmlParser.toXml(stringifiedXmlObj) fs.writeFile("./dataMain.xml", formatXml(finalXml, {collapseContent: true}), function(err) { if (err) { console.log("houston, we got a problem") } else { console.log("we did it, somehow") } }) })
关键修改说明
- 替换映射重构:将二维数组改为对象键值对,避免索引依赖,支持任意位置的单词替换
- 数组兼容处理:判断
<string>是否为数组,兼容单个标签的XML结构 - 正确的替换逻辑:使用正则表达式
\b匹配完整单词,g标志实现全局替换,避免替换到单词中间(比如避免把"your"里的"you"替换成"u") - 启用转小写:完善转小写逻辑,确保所有文本先转为小写再处理
- 随机前缀后缀:通过
Math.random()随机选取预设的前缀和后缀添加到处理后的文本中 - 错误处理增强:添加文件读取失败的错误捕获,避免程序崩溃
内容的提问来源于stack exchange,提问作者burden boy
相关产品推荐
相关产品推荐

