我们需要在XML文件中找到所有前缀:名称空间对。我们允许用户提供任何XML文件和任何XPath来查询它。我们需要找到前缀:uri映射,以便在评估XPath时设置它们。
我们目前使用:
selectNodes("//namespace::*[name() != 'xml'][not(../../namespace::*=.)]");
这确实会返回所有对。问题是它很慢。我看了this answer,但也很慢。有没有快速的方法来做到这一点?我只需要对XML执行XPath查询。
我在Java(使用dom4j)和.NET中都这样做。
谢谢 - 戴夫
答案 0 :(得分:0)
您将无法对Michael Kay和Dimitre 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(.), '
'
)
)