背景
我正在使用xml-flow
npm 包使用流解析 XML。问题是 xml 节点以一种意想不到的方式被解析。
我的意图是使用重复的 xml 节点解析一个巨大的 XML 文件。XML 文件可以是任何 URL,并且重复节点将从 UI 提供。
我尝试使用具有所有可能值的选项,但解析行为似乎没有改变。
示例代码
我使用了以下示例 XML -
<list>
<item>
<details>
<id>1</id>
</details>
</item>
<item>
<details>
<id>2</id>
<description>description for item 2</description>
</details>
</item>
</list>
我尝试使用item
作为重复节点来解析它,如下所示 -
const fs = require("fs");
const flow = require("xml-flow");
const xmlStream = flow(fs.createReadStream("./sample.xml"));
xmlStream.on('tag:item', function (person) {
console.log(JSON.stringify(person, null, 4));
});
我得到了 2 个解析的 xml 节点的以下响应 -
// node 1
{
"$name": "item",
"details": "1"
}
// node 2
{
"$name": "item",
"details": {
"id": "2",
"description": "description for item 2"
}
}
问题
正如您在响应中看到的,我为解析的 XML 节点获得了不同的 JSON 结构。
在第一个 XML 节点的情况下,<id>
节点没有出现在 JSON 对象中(与第二个 XML 节点不同),因为它的父节点即。<details>
只有一个子节点,即。<id>
.
这导致我的应用程序出现问题,因为解析的 XML 可能有数千条记录,并且由于这种行为,JSON 结构中到叶节点的相对路径正在发生变化。
例如,如果 xml 文件中有 10000 条记录,并且第 5000 条记录之后的所有记录都具有节点 2 结构,item.details
则相对路径将指向记录 1 到 5000 的字符串,而相同路径将指向剩余记录的对象。
替代 NPM 包
我确实尝试使用xml-stream
which 在相同的逻辑上工作,但它带来了收集这里解释的子项目的问题,这对我来说是一个更复杂的问题,因为在这种情况下传入的 XML 结构将因文件而异。
如果我需要提供更多信息,请告诉我。
干杯!