Javascript 如何使用node js在XML文件中添加/修改节点
假设我有以下xml代码Javascript 如何使用node js在XML文件中添加/修改节点,javascript,xml,node.js,express,Javascript,Xml,Node.js,Express,假设我有以下xml代码 约翰 史密斯 阿贝 林肯 詹姆斯 债券 我想添加一个新节点,假设如下: 托尼 明显的 如何在NodeJS中执行此操作?我的意思是我有一个文件(/routes/index.js,确切地说是在NodeJSExpress中),我希望能够添加/修改现有的xml文件。我尝试了fs.writeFile(),但这会写入一个全新的文件,fs.appendFile()会在最后一个节点后添加一个头(?xml+编码和其他内容)和根节点,因此我无法将其插入目录节点。我也无法摆脱xml声明
约翰
史密斯
阿贝
林肯
詹姆斯
债券
我想添加一个新节点,假设如下:
托尼
明显的
如何在NodeJS中执行此操作?我的意思是我有一个文件(/routes/index.js,确切地说是在NodeJSExpress中),我希望能够添加/修改现有的xml文件。我尝试了fs.writeFile(),但这会写入一个全新的文件,fs.appendFile()会在最后一个节点后添加一个头(?xml+编码和其他内容)和根节点,因此我无法将其插入目录节点。我也无法摆脱xml声明头。我一直在使用.builder()来实现这一点,它看起来是这样的
router.post('/addnode', function (req, res) {
var obj = {name: "Tony", surname: "Stark"};
var fs = require('fs');
var xml2js = require('xml2js');
var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);
fs.writeFile('public/test.xml', xml, function (err) {
if (err) throw err;
console.log('It\'s saved!');
});
});
最后,我想从一个fromaddnode中获取数据,因此我不会在这个函数中创建一个var obj。除非文件的大小不可接受,并且您不能将其作为一个整体来读取,否则您可以使用XML,也永远不能使用XML 通过使用它,您可以读取文件,将其转换为更易于操作的对象,在其中添加内容,然后将其转换为XML,并将结果再次写入原始文件
看看您的示例,您创建了一个新对象并将其附加到文件中。相反,您应该读取已经存在的数据并修改它们,然后将所有内容写回(不要附加它们)文件。为此,您必须使用
xml2js
中的解析器
对象。您可以使用第三方库,如,或
假设您的xml代码中有数据变量:
let data = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<catalog>
<person>
<name>John</name>
<surname>Smith</surname>
</person>
<person>
<name>Abe</name>
<surname>Lincoln</surname>
</person>
<person>
<name>James</name>
<surname>Bond</surname>
</person>
</catalog>`;
如何修改json对象?我确实将xml的内容解析为json对象并在其他地方显示,因此我知道如何用json覆盖现有xml,但我不确定如何向json对象添加内容,特别是当我要添加的内容必须嵌套在内部节点中时。我使用fs.readFileSync加载数据。
xml2js
创建从XML开始的对象的方式有很好的文档记录(请参阅库参考)。这也是非常直观的,如果您有问题,您仍然可以打开另一个关于stackoverflow的问题。;-)
const xml2js = require('xml2js');
xml2js.parseString(data, (err, result) => {
result.catalog.person.push({ name: 'Tony', surname: 'Stark' });
const builder = new xml2js.Builder();
data = builder.buildObject(result);
// write data to file
});
const convert = require('xml-js');
const result = convert.xml2js(data, { compact: true });
result.catalog.person.push({ name: { _text: 'Tony' }, surname: { _text: 'Stark' } });
data = convert.js2xml(result, { compact: true, spaces: 2 });
// write data to file
const xml = require('xml-parse');
let result = xml.parse(data);
result.find(n => n.tagName === 'catalog').childNodes.push({
type: 'element',
tagName: 'person',
childNodes: [{
type: 'element',
tagName: 'name',
childNodes: [{
type: 'text',
text: 'Tony'
}]
}, {
type: 'element',
tagName: 'surname',
childNodes: [{
type: 'text',
text: 'Stark'
}]
}],
});
data = xml.stringify(result, 2);
// write data to file