在XML文件中查找所有前缀:url名称空间 - 快速

时间:2013-01-25 00:10:54

标签: xml xpath xml-namespaces

我们需要在XML文件中找到所有前缀:名称空间对。我们允许用户提供任何XML文件和任何XPath来查询它。我们需要找到前缀:uri映射,以便在评估XPath时设置它们。

我们目前使用:

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

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

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

谢谢 - 戴夫

1 个答案:

答案 0 :(得分: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(.), '
'
  )
)