为什么 SelectSingleElement 适用于某些查询,而不适用于其他查询



我有以下XML片段(Zimbra SOAP API,如果有人关心,但这并不重要)

<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

但我无法选择 appt、appt/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 信封,这可能会搞砸命名空间,但是为什么第一个查询会起作用呢?(顺便说一下,即使不使用前缀/命名空间逻辑,第一个查询也可以工作)

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

//prefix:appt/inv

应该是:

//prefix:appt/prefix:inv

格式错误异常是由于以下原因造成的,因为元素名称不能以/开头:

//prefix:/appt/inv
//prefix:/inv

相关内容

最新更新