访问 salami slice 格式的巨大 XML 的最快方法是什么?

What is the fastest way to access huge XMLs in salami slice format?

我们每天都会获取包含完整数据集的最新 XMLs。这甚至可能在一天内发生多次。现在我们想要 运行 我们的测试脚本在 XML 秒内访问这些数据。 XML 采用意大利腊肠切片格式构建。

<Book id="01">
    <Name>A</Name>
    <ChapterRef id="02"></ChapterRef>
</Book>

<Book id="03" >
    <Name>B</Name>
    <ChapterRef ref="02"></ChapterRef>
    <ChapterRef ref="04"></ChapterRef>
</Book>

<Chapter id="02">
    <Name>Introduction</Name>
    <nPages>10</nPages>
</Chapter>

<Chapter id="04">
    <Name>Summary</Name>
    <nPages>20</nPages>
</Chapter>

注意: ID 是唯一的。

使用 Xpath/XQuery,访问数据的查询类似于:- 获取 nPages 的值,其中 Book.Name = "B" && Chapter.Name = "Summary".

问题: XMLs 中有大量数据。因此,如上所示随机访问这些 XML 文件需要花费大量时间。目前我们正在使用 XSLT 将数据从萨拉米香肠切片转换为俄罗斯套娃,以便快速访问数据。但这会使 XML 文件非常大。

我想知道基于原生 XML 的数据库(BaseX 等)是否可以在这方面提供帮助。他们能否以带索引的意大利腊肠切片格式(无需转换)存储数据,以便快速访问数据? 另外一个需要考虑的重要因素是,如果将此数据导入基于本地 XML 的数据库,并且其索引需要花费大量时间或者是一项手动任务,那么此解决方案也不是一个可行的解决方案。

注意:只需要"Read Only"随机访问即可读取数据库中的数据。无需将其写回 XMLs.

使用流式处理可以使用 XSLT 处理大型 XML 文档,这也是一种强制自己只浏览文档一次的方法。流式处理也被设计为工作 "as the data arrives",这意味着转换可以在另一个进程正在写入流(可以是文件或字节流,只要它是 XML)时就已经开始了。

这是 XSLT 3.0 的新功能,Saxon and Exselt 支持(至少)。

如果您需要随机访问,XML 数据库可能是更好的解决方案。您可以使用 XQuery 仅对需要更新的部分进行更新,从而避免您每次都必须处理大量 XML 的初始集。此外,借助 XQuery,您可以通过 XSLT + XPath 重用现有技能,因为这两种语言有很多共同点,但 XQuery 更适合数据库访问。

Whosebug 不允许推荐工具,所以我不会讨论您应该选择哪些 XML 数据库,这显然是根据预算、实施时间、现有资源的重用来决定的技术和知识等