2015-04-16 67 views
1

在我們的例子中,我們有動態XML標籤像這樣的XPath名稱空間通配符最佳實踐

<ab:SomeProcessResponse xmlns:ab="http://something.com/xyz" 
         xmlns:cd="http://something.com/lmno"> 

或者有時候我可能會得到響應,

<def:SomeProcessResponse xmlns:def="http://something.com/xyz" 
         xmlns:cd="http://something.com/lmno"> 

什麼是我應該選擇的節點遵循最佳實踐SomeProcessResponse在這種情況下?

回答

2

這裏沒有必要使用「通配符」,因爲這兩個示例都是相同的XML - 本地名稱爲SomeProcessResponse和名稱空間URI http://something.com/xyz的元素。它們使用兩個不同前綴的事實是不相關的,XPath表達式中使用的前綴綁定取決於XPath庫,並且不必與文檔中使用的前綴綁定匹配。

您需要使用XPath庫提供的功能將前綴(如xyz)綁定到http://something.com/xyz名稱空間URI,然後XPath xyz:SomeProcessResponse將匹配這兩個示例。

爲了給出更具體的答案,我需要知道您正在使用哪種編程語言和哪種XPath API。


編輯:在您的評論你說你使用JavaScript - 在這種情況下,你可以通過一個函數來document.evaluate

var result = document.evaluate("//xyz:SomeProcessResponse", document, function(prefix) { 
    if(prefix == "xyz") { 
    return "http://something.com/xyz"; 
    } else { 
    return null; 
    } 
}, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null); 
+0

我們使用javascript –

0

如果您在聲明命名空間提供命名空間綁定,無論是響應將被正確識別。

如果你需要的是一個xpath定位元素,無論命名空間,你可以使用這個:

//*[local-name()='SomeProcessResponse'] 
記住

但熊,這將是適用於所有的下列情況:

<ab:SomeProcessResponse xmlns:ab="http://something.com/xyz" xmlns:cd="http://something.com/lmno"> 
<def:SomeProcessResponse xmlns:def="http://something.com/xyz" xmlns:cd="http://something.com/lmno"> 
<ab:SomeProcessResponse xmlns:ab="http://somethingCompletelyDifferent.com/xyz"> 
<SomeProcessResponse> 
+0

謝謝parakmiakos! –

4

選擇名稱空間XML元素的最佳做法是指定命名空間而不是通過任何種類的「通配符」機制來忽略它。

對於兼容的XPath處理器,總有一種機制,允許一個命名空間前綴的結合(例如:ab)到一個命名空間URI(例如:http://something.com/xyz)。甚至不需要使用源XML中使用的相同名稱空間前綴(ab);只有名稱空間URI(http://something.com/xyz)必須匹配。但唯一的挑戰是XPath本身沒有將名稱空間前綴綁定到名稱空間URI的機制。如何做到這一點取決於庫提供的設施(例如:libxml2,javax.xml.xpath等)或託管語言(例如:XSLT)。

爲了提供一個純粹的XPath答案,或者有時是因爲對命名空間的厭惡(通常是非理性的),您有時會看到使用通配符機制。一個通用的通配符機制是使用local-name()僅引用與名稱空間無關的本地名稱(例如:SomeProcessResponse)。這樣做的問題是,它不僅會繞過名稱空間前綴(例如:ab),還會繞過名稱空間URI(http://something.com/xyz),並且名稱空間URI是名稱的一部分,也是將其他設施與元素關聯的重要部分。例如,這樣的其他設施包括驗證和OO類映射。

所以,是的,也有躲着命名空間通配符機制,但最好的做法是使用託管語言/庫的設施名稱空間前綴與名稱空間URI相關聯,避免通過通配符命名空間。

+0

謝謝Kenneth! –