2013-02-07 63 views
1

我有一個XPath查詢對我來說看起來很合適,但沒有返回任何結果。我的屬性搜索XPath查詢有什麼問題

它正在對測試的XML文檔:

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Deployment.Parts> 
    <AssemblyPart x:Name="foo" Source="foo.dll" /> 
    </Deployment.Parts> 
</Deployment> 

代碼:

Xml = new XmlDocument(); 
Xml.LoadXml(text); 
Manager = new XmlNamespaceManager(Xml.NameTable); 
//use constants for namespaces to make more readable 
Manager.AddNamespace("a", NS_DEPLOYMENT_2007); //use 'a' for default namespace here so xpath is easier 
Manager.AddNamespace("x", NS_XAML_2006); 

string xpath="//a:Deployment.Parts/a:AssemblyPart[@a:Source='foo.dll']"; 
var tmp = Xml.SelectNodes(xpath, Manager); 

什麼是錯在這裏我的XPath查詢?

回答

3

您需要從屬性中刪除命名空間前綴:

string xpath="//a:Deployment.Parts/a:AssemblyPart[@Source='foo.dll']"; 

你只需要指定屬性的名稱空間,如果明確有定義的命名空間,所以,當你想查詢Name屬性,您必須添加它:

string xpath="//a:Deployment.Parts/a:AssemblyPart[@x:Name='foo']"; 
1

懷疑這部分是你的問題:

@a:Source='foo.dll' 

不像元素名稱,屬性名稱不繼承命名空間。你的文檔沒有爲該屬性指定一個命名空間,所以我認爲你也不應該這樣做。

儘量只:

@Source='foo.dll' 

(順便說一句,我會親自使用LINQ到XML,而不是XPath的 - 我覺得一般簡單的情況因人而異,但它可能是值得考慮的 - 如果你正在使用。 .NET 3.5或更高版本,當然)

"Namespaces in XML 1.0 (3rd edition)" section 6.2(重點煤礦):

默認命名空間聲明的範圍從起始標籤開始擴展在它出現相應結束標記的結束,不包括任何內部默認名稱空間聲明的範圍。如果是空標籤,範圍就是標籤本身。

默認名稱空間聲明適用於其範圍內的所有無前綴的元素名稱。 默認名稱空間聲明不直接應用於屬性名稱;前綴屬性的解釋是由它們出現的元素決定的。