0

我们需要在 XML 文件中找到所有 prefix:namespace 对。我们允许用户提供任何 XML 文件和任何 XPath 以对其进行查询。在评估 XPath 时,我们需要找到 prefix:uri 映射来设置它们。

我们目前使用:

selectNodes("//namespace::*[name() != 'xml'][not(../../namespace::*=.)]");

这确实会返回所有对。问题是它很慢。我看了这个答案,但它也很慢。有没有快速的方法来做到这一点?我只需要它来针对 XML 执行 XPath 查询。

我在 Java(使用 dom4j)和 .NET 中都这样做。

谢谢 - 戴夫

4

1 回答 1

0

您将无法对Michael KayDimitre Novatchev提供的链接问题的答案中提供的代码进行大量更改。

这段代码(也是他们的)只触及每个节点(元素和属性)一次,因此内部所有内容的运行时间都distinct-values()取决于O(n)节点的数量。在最坏的情况下,每个节点都附加了一些命名空间,因此您必须对这 n 个节点进行排序,这适用O(n*log n)于任何合理的排序算法。

(: each namespace:uri-combination only once :)
distinct-values(
  (: analyze all nodes with namespace set, both attributes and elements :)
  /descendant-or-self::*/(.|@*)[namespace-uri(.)]
  (: build result string :)
  /concat(
    substring-before(name(), ':'), ': ', namespace-uri(.), '
'
  )
)
于 2013-01-25T00:55:26.323 回答