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

问题描述 投票:0回答:1

背景

我正在使用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结构将因文件而异。

如果我需要提供更多信息,请告诉我。

干杯!

node.js npm xml-parsing xml-to-json
1个回答
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文件中的重复节点。

© www.soinside.com 2019 - 2024. All rights reserved.