2013-09-26 217 views
0

我有下列XML片斷(Zimbra的SOAP API,如果有人關心,但它並不重要)爲什麼SelectSingleElement適用於某些查詢,但不適用於其他查詢?

<appt id="266" uid="bf177af2-2875-447a-8e74-d9bc8c108611" nextAlarm="1409547300000" d="1380213518000" rev="63" s="0" l="10" xmlns="urn:zimbraMail"> 
    <inv id="265" seq="3" compNum="0" type="appt"> 

我有一個包含這個片段的XmlElement的。我已成立了一個命名空間管理等,如下

XmlNamespaceManager ns = new XmlNamespaceManager(element.OwnerDocument.NameTable); 
ns.AddNamespace("prefix", "urn:zimbraMail"); 

下面的代碼

element.SelectSingleNode("//prefix:" + "appt/@id", ns).Value 

收益266如預期

,但我不能設法選擇聘任,聘任/ INV或其他任何東西,除了基本上是appt的屬性。以下是我嘗試過的一些查詢。一些返回null,一些返回的格式錯誤(因爲我周圍的顛簸)

element.SelectSingleNode("//prefix:" + "appt/inv", ns).Value 
element.SelectSingleNode("//prefix:" + "/appt/inv", ns).Value 
element.SelectSingleNode("//prefix:" + "/inv", ns).Value 
element.SelectSingleNode("//prefix:" + "appt", ns).Value 

我也試過不包括前綴等任何幫助過?部分問題可能是OwnerDoc是一個SOAP信封,可能會弄亂名稱空間,但爲什麼第一個查詢會起作用? (順便說一句,即使不使用前綴/名稱空間邏輯,第一個查詢仍然有效)

回答

1

您需要限定所有元素,而不僅僅是第一個元素。所以:

//prefix:appt/inv 

應該是:

//prefix:appt/prefix:inv 

壞格式異常是由於以下,因爲元素名稱不能以/開始:

//prefix:/appt/inv 
//prefix:/inv 
+0

那一定是這是我見過的最愚蠢的事情。這使xpath語法幾乎對我毫無價值。 –

+0

我結束了剛剛剝離的命名空間,它使所有的事情都變得更容易。 –

+0

歡迎使用XML - 非常有用但非常冗長:) –

相關問題