我正在使用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的字符串,而相同的路径将指向到剩余记录的对象。
我确实尝试使用xml-stream
来处理相同的逻辑,但是它带来了收集子项explained here的问题,这对于我来说是更复杂的问题,因为它是XML中的传入XML结构。这种情况因文件而异。
让我知道是否需要提供更多信息。
干杯!
答案 0 :(得分:0)
好吧!在完成了这些软件包的实现之后,除非提供了明确的支持,否则似乎没有解决此问题的方法(我可能会漏掉一些东西)。
我最终决定编写新的逻辑,最终编写了一个新的npm软件包xtreamer,该软件包提供xml节点,而不是将其转换为JSON对象。
此软件包公开了一个transform stream
,可以将其与任何readable stream
进行管道传输。它期望请求中的xml节点名称,并发出自定义事件xmldata
以输出xml节点。
根据获取最终JSON的要求,可以将输出插入任何xml-json npm package
中。检查npm软件包以获取更多详细信息。
支持模块
我设法再创建一个npm软件包xtagger,该软件包使用sax npm package
并提供以下格式的xml结构-
structure: { [name: string]: { [hierarchy: number]: number } };
此包可用于通过考虑节点的层次结构来查找xml文件中的重复节点。