Почему 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