访问 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 数据库,这显然是根据预算、实施时间、现有资源的重用来决定的技术和知识等
我们每天都会获取包含完整数据集的最新 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 数据库,这显然是根据预算、实施时间、现有资源的重用来决定的技术和知识等