Анализ XML с кратким синтаксисом

В моем приложении я конвертирую один веб-сервис в другой. Я получаю ответ XML как XmlDocument. Я пытаюсь получить определенные узлы в документе. Я знаю, что будет только один экземпляр узла, который я ищу. Предыдущий реализатор смог получить именно то, что хотел:

XmlNode node = xmlDoc.SelectSingleNode("//result/geometry/location/lat/text()");

Я пытаюсь сделать то же самое со своим ответом, но всегда возвращаю ноль. Я знаю (смутно), как выглядел его XML-ответ, и знаю свой. Но я не могу использовать его синтаксис. Я получаю null несмотря ни на что. Я использую более сложный оператор:

XmlNode xmlNode = xmlDoc.GetElementsByTagName("StatusDescription").Item(0);

Но, как видите, некрасиво. И, что еще хуже, всякий раз, когда я пытаюсь углубиться более чем на один узел, я получаю нуль:

XmlNode xmlNode = xmlDoc.GetElementsByTagName("/ResourceSets/ResourceSet").Item(0);

Я пробовал вставлять и удалять косые черты в нескольких местах, но безрезультатно. XML, полученный предыдущим реализатором, не представляет собой ничего особенного; это просто XML. Но он может легко прыгать повсюду.

Вот фрагмент его XML-ответа:

<GeocodeResponse>
 <status>OK</status>
 <result>
  <geometry>
   <location>
    <lat>37.4217550</lat>
    <lng>-122.0846330</lng>
   </location>
  </geometry>
 </result>
</GeocodeResponse>

Вот мой фрагмент:

<Response xmlns="http://schemas.microsoft.com/search/local/ws/rest/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <StatusCode>200</StatusCode>
  <StatusDescription>OK</StatusDescription>
  <ResourceSets>
    <ResourceSet>
      <EstimatedTotal>1</EstimatedTotal>
        <Resources>
          <Location>
              ...
          </Location>
        </Resources>
    </ResourceSet>
  </ResourceSets>
</Response>

Любая идея, как я могу пройти XML так же легко, как он?


person Frecklefoot    schedule 16.10.2015    source источник
comment
Вы пробовали очевидные XmlNode node = xmlDoc.SelectSingleNode("//StatusDescription/text()"); и XmlNode node = xmlDoc.SelectSingleNode("/ResourceSets/ResourceSet/");?   -  person Ken White    schedule 16.10.2015


Ответы (1)


Фундаментальное отличие состоит в том, что его XML не имеет пространства имен по умолчанию, в то время как ваш имеет пространство имен по умолчанию, объявленное здесь:

xmlns="http://schemas.microsoft.com/search/local/ws/rest/v1"

Кстати, эта тема (запрос XPath к XML с пространством имен по умолчанию) уже много раз задавалась в различных формах здесь, в SO. Обратите внимание, что элемент, в котором объявлено пространство имен по умолчанию, и все его потомки без префикса и без другого объявления пространства имен по умолчанию считаются находящимися в этом вышеупомянутом пространстве имен по умолчанию. И один из возможных способов запроса элемента в пространстве имен — сопоставление префикса с uri пространства имен с помощью диспетчера пространства имен, а затем правильное использование сопоставленного префикса в XPath, например:

var nsManager As New XmlNamespaceManager(new NameTable());
nsManager.AddNamespace("d", "http://schemas.microsoft.com/search/local/ws/rest/v1");
XmlNode xmlNode = xmlDoc.SelectSingleNode("//d:StatusDescription", nsManager);
person har07    schedule 16.10.2015
comment
Спасибо, har07. Сделал свое дело! Сначала искал ответ, но не нашел. Наверное, я не знал, что именно искать. :/ - person Frecklefoot; 16.10.2015