gpt4 book ai didi

xml - 带有谓词 : How to avoid quadratic time increase 的 XPath

转载 作者:行者123 更新时间:2023-12-03 17:26:31 25 4
gpt4 key购买 nike

考虑这个简化的 Adob​​e Premiere 项目文件:

<Project>
<Sequences>
<UID.1>a</UID.1>
<UID.2>b</UID.2>
<UID.3>c</UID.3>
</Sequences>
</Project>
<Sequence ObjectUID="a"> ... </Sequence>
<Sequence ObjectUID="b"> ... </Sequence>
<Sequence ObjectUID="c"> ... </Sequence>
<Sequence ObjectUID="x"> ... </Sequence>

目标是找到 Project/Sequences/UID.N 引用的所有序列元素

我构建了这个 Xpath 查询:
/Sequence[@ObjectUID=
/Project/Nodes/*[starts-with(local-name(),"UID.")]
]

这样做的问题是,对于一个非常大的 XML 文件(100 MB),即使其中只有 20 个 Sequence 元素,以及同一级别的 10000 个其他同级元素,搜索也需要很多秒。

如果我只收集内部查询的结果,即从
/Project/Nodes/*[starts-with(local-name(),"UID.")]

然后遍历 20 个 UID,通过 /PremiereData/Sequence[@ObjectUID='a'] 通过 ObjectUID 获取每个序列等等,它非常快。

这向我表明 Xpath 处理器不会像我期望的那样首先评估(和不变的)内部表达式一次,然后选择外部 expr 的元素,而是首先获取所有序列,然后重新评估内部谓词对于他们每个人,这就是让它如此缓慢的原因。

我说得对吗?我可以更改查询以使其不会发生,或者添加提示以告诉表达式评估器谓词是不变的吗?

最佳答案

大多数 XPath 处理器不做任何智能连接优化,它们只是使用嵌套循环。 Saxon-EE 是我所知道的唯一可以按照您建议的方式优化连接的处理器。

如果您在 XSLT 中,那么使用 xsl:key 是通常的解决方法,但在纯 XPath 中没有简单的答案 - 特别是如果它是 XPath 1.0。

关于xml - 带有谓词 : How to avoid quadratic time increase 的 XPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43057600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com