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.