【问题标题】:Run xpath expression in batch批量运行 xpath 表达式
【发布时间】:2015-07-22 08:46:34
【问题描述】:

我们需要针对大量文档运行很多 xpath 表达式,我想加快速度。 目前,我们加载文档并运行所有 xpath。如果有 1000 个文档和 1000 个 xpath,它大约是 1,000,000 次运行。我相信每一个 xpath 都从根节点开始遍历 xml(尽管我不确定它是如何在库中实现的)。我想做一些类似批处理 xpath 的运行,其中只需一次 xml 遍历就可以评估所有 1000 个 xpath。换句话说,对于 1 个文档,只需要一次 xml 遍历来评估 1000 个 xpath。是否已经实现了类似的东西?它甚至会加快 xpath 的执行速度吗?

编辑: 我输入的唯一内容是 xpath 列表和 xml 文档列表。由于它们可以由用户动态添加/删除,我主要是在寻找一种在运行时对 xpath 进行分组的解决方案(不要在预配置中这样做,即使它可能有助于加快框架提供的 xpath)。

【问题讨论】:

    标签: java xml xpath batch-processing


    【解决方案1】:

    我建议将数据放在 XML 数据库中,例如 BaseX 或 eXist。这些产品构建索引,用于加速查询执行。建立索引是有成本的,但是超过 1000 个查询应该保存很多次。

    【讨论】:

    • 谢谢,这些数据库看起来很有前途。我认为这是我们一直在寻找的框架。
    【解决方案2】:

    你能按层次组织你的 xpath 吗? 例如,而不是运行

    • //a/b/x
    • //a/b/y
    • //a/b/z

    您能否预处理 xpath 以将公共前缀组合在一起,以便您在 //a/b 的结果上运行 xyz?我只能假设运行这 4 个 xpath(//a/bxyz)比运行上面的 3 个 xpath 更快。此外,如果 //a/b 失败,您可以避免运行子 xpath。

    我可以想象一些这样的配置:

    <xpaths>
        <xpathparent value="//a/b">
            <xpath value="x" handler="xHandler" />
            <xpath value="y" handler="yHandler" />
            <xpath value="z" handler="zHandler" />
        </xpathparent>
    <xpaths>
    

    【讨论】:

    • 这绝对是个好主意,但是 xpath 在我们的环境中确实是动态变化的。在框架中,用户可以禁用某些 xpaths 发生或注册自己的 xpaths。换句话说,大多数常见模式 xpath 可能彼此不了解,因为它们是在其他地方/由不同用户定义的。我将编辑问题以涵盖这种情况
    • 那么可能需要自动化。也许是一个自动化的过程,它将/ 上的所有 xpath 拆分并排列成一个层次结构?
    • 是的,像这样。你不知道这样的功能是否会由某些框架提供,或者是否需要实现?我认为这会有很多边缘情况(//a vs /root/a,属性等)
    • //a 在逻辑上与/root/a 不同,所以我没有看到任何其他选项,只能执行两者(并在层次结构中进行不同的分组)。不,我还没有听说过这样的框架
    • 是的,//a//b 都会遍历整个文档。请记住,遍历文档一次并为每一行执行//a//b 与遍历文档两次相同(一次用于//a,然后再次用于//b)。两者具有相同的复杂性。对于文档中的 1000 行,它是 2000 次执行。由于它是 DOM 操作,模型在内存中,因此 2 次遍历不需要额外的 IO。我的层次结构建议的真正胜利是,如果找不到父级,您可以避免运行子 xpaths
    猜你喜欢
    • 2023-04-11
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多