2013-01-25 37 views
0

我們需要在XML文件中查找所有前綴:命名空間對。我們允許用戶提供任何XML文件和任何XPath來對其進行查詢。我們需要找到前綴:uri映射來設置評估XPath時的映射。在XML文件中查找所有前綴:url命名空間 - 快速

我們目前使用:

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

,這是否返回所有對。問題在於速度很慢。我看着this answer,但它也很慢。有沒有快速的方法來做到這一點?我只需要這個就可以對XML執行XPath查詢。

我在Java(使用dom4j)和.NET中都這樣做。

謝謝 - 戴夫

回答

0

你將不能夠做很多改動的答案提供給由Michael KayDimitre Novatchev提供的鏈接問題的代碼。

這段代碼(也是它們)僅僅觸及每個節點(元素和屬性)一次,因此運行時distinct-values()內的所有內容都是O(n)上的節點數量。在最壞的情況下,每個節點都附加了一些命名空間,因此您必須對這些n個節點進行排序,這些節點的排序算法爲合理排序算法0​​。

(: 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(.), '
' 
) 
) 
+0

distinct-values似乎是XPath 2.0的補充。我需要一個適用於1.0的解決方案(我們在Java中使用dom4j,在.NET中使用ADO.NET運行時)。 –

+0

只需在Java/.NET中刪除它並將結果排序| uniq'即可。 –