NodeJS 处理嵌套元素时,使用xml2js库解析XML时出错

ygya80vv  于 2023-06-22  发布在  Node.js
关注(0)|答案(1)|浏览(154)

我目前正在编写一个Node.js脚本,其中涉及使用xml2js库解析XML文件。该脚本读取XML文件,提取特定元素,并使用xml2js.Builder()构建新的XML输出。
对于简单的XML结构,该脚本工作得非常好。但是,当我遇到包含嵌套元素(<customs>元素)的XML文件时,它会抛出Invalid character in name错误。

const fs = require('fs');
const xml2js = require('xml2js');
const XmlStream = require('xml-stream');

const stream = fs.createReadStream('./test.xml');
const xmlStream = new XmlStream(stream);
const builder = new xml2js.Builder();

const MAX_ITEMS = 1;
let lists = [];
let listCount = 0;

xmlStream.on('endElement: list', function (item) {
  if (listCount < MAX_ITEMS) {
    lists.push(item);
    listCount++;
  } else {
    stream.destroy();
  }
});

stream.on('close', function () { 
   const outputXml = builder.buildObject({ lists: { list: lists } });
   console.log(outputXml);
});

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<lists>
  <list list-id="0001">
    <first-name>first-name-1</first-name>
    <last-name>second-name-1</last-name>
    <customs>
      <custom attribute-id="gender">female</custom>
    </customs>
  </list>
  <list list-id="0002">
    <first-name>first-name-2</first-name>
    <last-name>second-name-2</last-name>
    <customs>
      <custom attribute-id="gender">male</custom>
    </customs>
  </list>
</lists>

为什么在xml2js中处理嵌套元素时会发生此错误以及如何修复此错误?

jgovgodb

jgovgodb1#

xml-stream的默认文本属性是$text,而xml2js builder的默认文本属性是_,这就是为什么它会抱怨,所以它发生在具有属性的元素上,而不是嵌套元素上。
因此,尝试添加$text作为charkey选项:

const builder = new xml2js.Builder({charkey: '$text'});

相关问题