2013-09-26 254 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 - 非常有用但非常冗长:) –

相关问题