C# и XPath - как сделать запрос

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

<mediawiki ...>
  <siteinfo>...</siteinfo>
  <page>
    <title>The Title</title>
    <id>42</id>
    ...
  </page>
  ... more page items ...
</mediawiki>

Я немного рассказал о XPath-Query и написал следующий код:

_xmlArticlesDocument = new XmlDocument();
_xmlArticlesDocument.Load(xmlArticlesFileName);

Теперь я хочу получить элемент страницы с заданным id-Subelement. Итак, я написал:

XmlNode node = _xmlArticlesDocument.DocumentElement.SelectSingleNode
               ("//mediawiki/page[id=" + id.ToString() + "]");

но узел всегда нулевой. Я пробовал несколько запросов, в том числе "page/id", "page", "/page", "//page", чтобы получить что-нибудь, но узел всегда нулевой. Я быстро проверил переменную _xmlArticlesDocument, и она содержит правильный XML-файл с ожидаемой структурой.

Мне кажется, что я упустил что-то очень простое, но понятия не имею, что. Может, у кого-то здесь есть идея?

Спасибо заранее, Фрэнк

3 ответа

Решение

Запрос выглядит правильно на основании того, что вы нам показали. Однако я подозреваю, что в элементе mediawiki "..." есть атрибут xmlns="....", верно?

Я подозреваю, что это тебя и сбивает с толку. Вам понадобится такой код:-

 XmlNamespaceManager nsmgr = new XmlNamespaceManager(_xmlArticlesDocument.NameTable);
 nsmgr.AddNamespace("a", "the-namespace-in-them-xmlns-attribute");
 XmlNode page = _xmlArticlesDocument.SelectSingleNode(String.Format("//a:page[id={0}]", id), nsmgr);

Ты пытался:

_xmlArticlesDocument.DocumentElement.SelectSingleNode
               ("page[id='" + id.ToString() + "']"); // Note the single quotes

Кроме того, если какой-либо из узлов XML находится в пространстве имен, которое не является пространством имен по умолчанию (т.е. <mediawiki xmlns="whatever">) тогда вам тоже понадобится XmlNamespaceManager,

Проверьте Linq в XML. Я тоже нуб XML, и я считаю, что это проще, XMLDocument.

Другие вопросы по тегам