Почему SelectSingleElement работает для некоторых запросов, но не для других?

У меня есть следующий фрагмент XML (API-интерфейс Zimbra SOAP, если кому-то все равно, но это не важно)

<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. Вот несколько запросов, которые я пробовал. Некоторые возвращают нуль, некоторые возвращают плохой формат (как я бродил)

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
Другие вопросы по тегам