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

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")
    }
  })
})

关键修改说明

  1. 替换映射重构:将二维数组改为对象键值对,避免索引依赖,支持任意位置的单词替换
  2. 数组兼容处理:判断<string>是否为数组,兼容单个标签的XML结构
  3. 正确的替换逻辑:使用正则表达式\b匹配完整单词,g标志实现全局替换,避免替换到单词中间(比如避免把"your"里的"you"替换成"u")
  4. 启用转小写:完善转小写逻辑,确保所有文本先转为小写再处理
  5. 随机前缀后缀:通过Math.random()随机选取预设的前缀和后缀添加到处理后的文本中
  6. 错误处理增强:添加文件读取失败的错误捕获,避免程序崩溃

内容的提问来源于stack exchange,提问作者burden boy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:25:32