2016-02-25 74 views
0

xpath上的快速問題。我需要驗證根元素「Consumers」以及它的名稱空間聲明。這個xml可能會有所不同,具體取決於它介導的代理。使用不同名稱空間元素對單根元素進行Xpath驗證

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ss:Consumers xmlns:ss="http://xml.mycompany.com/XMLSchema"/> 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Consumers xmlns="http://xml.mycompany.com/XMLSchema"/> 

我需要編寫單個xpath表達式來驗證這兩種情況。請幫忙。

+0

你是什麼意思,「驗證?」元素存在? – OldProgrammer

+0

是的。我正在爲上述兩種方案尋找通用驗證。 – Charith

回答

2

在XPath中,不同的前綴並不重要,只要它指向相同的名稱空間URI即可。即使是空白前綴,即使用默認名稱空間聲明也意味着相同。

例如,因爲我已經宣佈xpathtester綁定到正確的命名空間URI的前綴foo,像這樣*:

foo="http://xml.mycompany.com/XMLSchema" 

以下XPath將在任何情況下返回1元:

//foo:Consumers 

*)注意,聲明在XPath中使用的前綴因平臺而異。這是一個專門針對xpathtester


爲了演示起見,我已經把兩個方案一個<root>元素中,和XPath返回兩個Consumers元素(運行演示here)。

示例XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<root> 
<ss:Consumers xmlns:ss="http://xml.mycompany.com/XMLSchema"/> 
<Consumers xmlns="http://xml.mycompany.com/XMLSchema"/> 
</root> 

輸出:

<ss:Consumers xmlns:ss="http://xml.mycompany.com/XMLSchema"/> 

<Consumers xmlns="http://xml.mycompany.com/XMLSchema"/> 
0

我一般建議,如果你要編寫代碼來處理兩個XML變體是相同的(或基本相同),除了對於命名空間URI來說,首先對命名空間URI進行規範化,即對文檔進行轉換,以便它們都使用相同的命名空間URI。命名空間中的差異然後被本地化到您的代碼中的一個位置,並且不會滲透您的整個應用程序。

1

你可以寫一個XPath表達式,將檢查名稱空間URI和元素的本地名稱,像這樣:

/*[local-name()='Consumers' and namespace-uri()='http://xml.mycompany.com/XMLSchema']

這就避免了與你的XPath登記任何名稱空間前綴實現。 此XPath也可用於XPath 1.0。

相關問題