Как читать XPathDocument, который имеет пространство имен - PullRequest
3 голосов
/ 03 декабря 2011

У меня есть следующий пример XML-файла:

<Top xmlns="abbr:SomeNSValue">
  <Next>
    <Other>SomeValue</Other>
  </Next>
</Top>

Я загружаю его и пытаюсь прочитать так:

FileStream stream = new FileStream(@".\TestXML.xml", FileMode.Open);
XPathDocument xPathDocument = new XPathDocument(stream);
XPathNavigator navigator = xPathDocument.CreateNavigator();

XmlNamespaceManager ns = null;
if (navigator.NameTable != null)
{
    ns = new XmlNamespaceManager(navigator.NameTable);
    ns.AddNamespace("abbr", "SomeNSValue");
}

XPathNodeIterator iterator = navigator.Select("/Top/Next", ns);
iterator.MoveNext();

Console.WriteLine(iterator.Current.InnerXml);

Выводит полный XML, показанный выше. Не то, что я ищу (я хочу выбрать содержимое узла «Далее».

Но если я возьму xmlns="abbr:SomeNSValue из XML и попробую снова, я получу то, что искал:

<Other>SomeValue</Other>

В моем реальном сценарии у меня есть XML-код, и мне бы не пришлось изменять его, чтобы отключить пространство имен.

Есть ли способ заставить эту работу работать с пространством имен в ней?

Примечание: Если это имеет значение, это фактическое пространство имен, которое у меня есть в моем файле XML: xmlns="urn:hl7-org:v2xml"

Ответы [ 2 ]

5 голосов
/ 03 декабря 2011

Ваше объявление пространства имен неверно:

<Top xmlns:abbr="SomeNSValue">
  <Next>
    <Other>SomeValue</Other>
  </Next>
</Top>

Когда вы делаете это волшебное изменение, остальная часть вашего кода работает:) ..

2 голосов
/ 07 февраля 2017

Древний вопрос, но я наткнулся на это из Google, пытаясь выяснить что-то подобное. Вот ответ, который может помочь другим пользователям Google.

Я пришел к выводу, что вы должны указать префикс пространства имен в выражении XPath (несмотря на то, что в файле XML нет префикса пространства имен).

ns.AddNamespace("foo", "urn:hl7-org:v2xml"); // make up whatever prefix you want here

и позже:

XPathNodeIterator iterator = navigator.Select("/foo:Top/foo:Next", ns);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...