繁体   English   中英

如何使用节点 js 在 XML 文件中添加/修改节点

[英]How to add/modify a node in XML file using node js

假设我有以下 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 + 编码和东西)和根节点,所以我无法插入它进入目录节点。 我也无法摆脱 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

除非文件的大小不可接受并且您无法将它们作为一个整体阅读,否则您可以使用xml2js并且永远不要使用 XML。

通过使用它,您可以读取文件,将其转换为一个更容易操作的对象,在那里添加您的内容,然后将其转换回 XML 并将结果再次写入原始文件。

查看您的示例,您创建了一个新对象并将其附加到文件中。 相反,您应该读取已经存在的数据并修改它们,然后将所有内容写回(不要追加它们)到文件中。 为此,您必须使用xml2jsParser对象。

您可以使用第三方库,如xml2jsxml-jsxml-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>`;
  1. xml2js
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
});
  1. xml-js
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
  1. xml解析
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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM