1

背景

我正在使用xml-flownpm 包使用流解析 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-streamwhich 在相同的逻辑上工作,但它带来了收集这里解释的子项目的问题,这对我来说是一个更复杂的问题,因为在这种情况下传入的 XML 结构将因文件而异。

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

干杯!

4

1 回答 1

0

出色地!在完成这些包的实现之后,除非提供明确的支持,否则似乎没有解决这个问题的方法(我可能错过了一些东西)。

我最终决定编写一个新逻辑并最终编写了一个新的 npm 包xtreamer,它提供 xml 节点而不是将它们转换为 JSON 对象。

这个包暴露了一个transform stream可以与任何readable stream. 它需要请求中的 xml 节点名称并发出自定义事件xmldata以输出 xml 节点。

xml-json npm package根据获取最终 JSON 的要求,可以将输出插入任何内容。检查 npm 包以获取更多详细信息。

支持模块

我设法创建了另一个 npm 包xtagger,它使用sax npm package并提供以下格式的 xml 结构 -

structure: { [name: string]: { [hierarchy: number]: number } };

此包可用于通过考虑其层次结构来查找 xml 文件中的重复节点。

于 2018-09-02T19:02:09.483 回答