如何在发送XML至REST API前动态修改其内容?
如何在发送XML到REST API前修改指定内容?
嘿,针对你要修改XML里的作者名再发送到API的需求,这里有两个实用的解决方案,根据你的XML结构复杂度来选就行:
方案一:简单字符串替换(适合结构固定的XML)
如果你的XML结构非常固定,<First>Simon</First>这个片段不会有格式变化(比如标签前后不会加空格、大小写不会变),直接用字符串替换是最简便的方法。只需要在读取XML之后、发送之前加一行替换代码:
data = await readFile(path.resolve(__dirname, file), 'utf8'); // 新增:替换单个匹配的作者名 data = data.replace('<First>Simon</First>', '<First>Zimon</First>'); // 如果需要替换所有出现的Simon,用全局正则表达式 // data = data.replace(/<First>Simon<\/First>/g, '<First>Zimon</First>'); const config = { headers: { 'Content-Type': 'text/plain', 'Content-Length': data.length, // 注意更新内容长度 }, }; result = await axios.post( 'https://someRestapi.com/', data, config, );
注意:这种方法的缺点是不够灵活,如果XML的格式有细微变化(比如<First> Simon </First>带空格),替换就会失效,只适合简单、固定的场景。
方案二:使用XML解析库(适合复杂/动态XML结构)
如果你的XML结构可能变化,或者需要修改多个不同节点,用专业的XML解析库会更可靠。这里推荐xml2js(轻量易用)或者fast-xml-parser(性能更好),以xml2js为例:
- 先安装依赖:
npm install xml2js
- 修改你的代码,解析XML为JSON对象,修改值后再转回XML:
const xml2js = require('xml2js'); const parser = new xml2js.Parser(); const builder = new xml2js.Builder(); data = await readFile(path.resolve(__dirname, file), 'utf8'); // 解析XML为JSON对象 const xmlObj = await parser.parseStringPromise(data); // 修改First节点的值(注意xml2js解析后会把节点转为数组格式) xmlObj.Document.Author[0].Name[0].First[0] = 'Zimon'; // 转回XML字符串 const modifiedData = builder.buildObject(xmlObj); const config = { headers: { 'Content-Type': 'text/plain', 'Content-Length': modifiedData.length, // 使用修改后的内容长度 }, }; result = await axios.post( 'https://someRestapi.com/', modifiedData, config, );
这种方法的优势是不管XML的格式怎么变(比如标签前后有空格),都能准确找到对应的节点修改,适合复杂或动态变化的场景。
内容的提问来源于stack exchange,提问作者zlZimon
相关产品推荐
相关产品推荐

