xml-flow NPM软件包-意外的XML解析行为

时间:2018-09-01 15:50:17

标签: node.js npm xml-parsing xml-to-json

背景

我正在使用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来处理相同的逻辑,但是它带来了收集子项explained here的问题,这对于我来说是更复杂的问题,因为它是XML中的传入XML结构。这种情况因文件而异。

让我知道是否需要提供更多信息。

干杯!

1 个答案:

答案 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文件中的重复节点。