假设我有以下xml代码
<?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>
我想添加一个新节点,让我们说以下内容:
<person>
<name>Tony</name>
<surname>Stark</surname>
</person>
如何在节点js中执行此操作?我的意思是我有一个文件(确切地说是节点js express中的/routes/index.js),我希望能够添加/修改现有的xml文件。我尝试过 fs.writeFile(),但这会写一个全新的文件,而 fs.appendFile()会添加一个标题(?xml + encoding and stuff)和最后一个节点之后的根节点,所以我无法将其插入到目录节点中。我也无法摆脱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!');
});
});
最后,我想从 addnode 中获取数据,因此我不会在此函数中创建 var obj 。
答案 0 :(得分:2)
除非文件的大小不可接受并且您无法将它们作为一个整体阅读,否则您可以使用xml2js并且永远不会使用XML。
通过使用它,您可以读取文件,将其转换为更容易操作的对象,在那里添加您的东西,然后将其转换回XML并将结果再次写入原始文件。
查看您的示例,您将创建一个新对象并将其附加到该文件。相反,您应该读取已存在的数据并对其进行修改,然后将所有内容写回(不要将它们附加到)文件中。为此,您必须使用Parser
中的xml2js
对象。
答案 1 :(得分:2)
您可以使用xml2js,xml-js或xml-parse之类的第三方库。
假设您的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>`;
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