使用xml2js构建具有相同子键的xml?

时间:2016-03-09 20:16:01

标签: javascript xml node.js

我正在使用xml2js从我的寄存器构建.xml。对于每个元素,我需要设置具有相同名称的密钥,示例:key:具有属性ID的产品

预期结果:

<products>
  <product id="H12896">
    <name>Grand Hotel New York</name>
    <price>120.80</price>
  </product>
  <product id="...">
    ...
  </product>
</products>

我的代码:

var products = [];

_.each(list, function(element) {

    var obj = {
      name: element.title,
      price: element.price,
    };

    products.push(obj);


});


var builder = new xml2js.Builder({rootName: 'products'});
var xml = builder.buildObject(products);
fs.writeFile('pacotes.xml', xml, (err) => {
  if (err) throw (err);
});

输出结果:

<products>
  <0>
    <name>Mountain Do</name>
    <price>0</price>
  </0>
</products>

我检查了文档,但还没有。 感谢

2 个答案:

答案 0 :(得分:4)

您是否有理由不使用XMLBuilder? https://github.com/oozcitak/xmlbuilder-js/

XMLBuilder似乎更适合你想要做的事情,并且更受欢迎(例如:上个月有400万次下载)。 xml2js更适合在JavaScript中阅读,但XMLBuilder绝对是你想要使用的。

如果我正确阅读...... xml2js就是在XMLBuilder上构建的。

var builder = require('xmlbuilder'),
    xml = builder.create('root'),
    products = xml.ele('products'),
    product;

_.each(list, function(element) {
    product = products.ele('product');
    product.att('id', element.id);
    product.ele('name', null, element.name);
    product.ele('price', null, element.price);
});

xml = xml.end();
fs.writeFile('pacotes.xml', xml, (err) => {
    if (err) throw (err);
});

答案 1 :(得分:0)

您可以只创建对象列表,然后使用要用作键的名称:

const productList = [
  { name: 'foo', price: 30 },
  { name: 'bar', price: 5 },
  { name: 'baz', price: 87 },
];

const obj = { product: [] }

productList.forEach(element => obj.product.push({
  name: element.title,
  price: element.price,
}));

const builder = new xml2js.Builder({rootName: 'products'});
const xml = builder.buildObject(obj);
console.log(xml);

输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<products>
  <product>
    <name/>
    <price>30</price>
  </product>
  <product>
    <name/>
    <price>5</price>
  </product>
  <product>
    <name/>
    <price>87</price>
  </product>
</products>