Javascript 如何使用node js在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声明

假设我有以下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>`;
  • xml-js
  • xml解析

  • 如何修改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