C # XmlDocument SelectNodes - PullRequest
       5

C # XmlDocument SelectNodes

8 голосов
/ 08 августа 2009

У меня есть XML-документ с корневым элементом, двумя дочерними элементами: «диагностика» и «результаты». Элемент 'results' имеет произвольное количество элементов с именем 'result'

Когда это загружено в XmlDocument, легко перемещаться по структуре и видеть, что именно так все и работает. Я могу написать рекурсивную функцию, которая выбирает все элементы «результата». XmlDocument.SelectNodes ("// results") не находит узел без проблем.

Тем не менее, * XmlDocument.SelectNodes ("// results / result") ничего не находит.
* XmlDocument.SelectNodes ("// result") ничего не находит.

Я разговаривал с коллегой, и ему было жаль, используя Xpath в XmlDocument.SelectNodes. Кто-нибудь еще сталкивался с такой проблемой? Любые решения?

ФАЙЛ XML:

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="10" yahoo:created="2009-08-07T10:19:59Z" yahoo:lang="en-US" yahoo:updated="2009-08-07T10:19:59Z" yahoo:uri="http://query.yahooapis.com/v1/yql?q=select+*+from+search.news+where+query%3D%22Tanzania%22">
    <diagnostics>
        <publiclyCallable>true</publiclyCallable>
        <url execution-time="47"><![CDATA[http://boss.yahooapis.com/ysearch/news/v1/Tanzania?format=xml&start=0&count=10]]></url>
        <user-time>49</user-time>
        <service-time>47</service-time>
        <build-version>2579</build-version>
    </diagnostics>
    <results>
        <result xmlns="http://www.inktomi.com/">
            <abstract>Kakungulu Cup winners SC Villa face Tanzania’s Simba SC this afternoon at the National stadium in Dar es salaam. “We had a very tiresome journey. The road was so bad and the road blocks were so many. However, we finally reached but the boys were so tired,” said Kato.</abstract>
            <clickurl>http://lrd.yahooapis.com/_ylc=X3oDMTQ4cXAxcnRoBF9TAzIwMjMxNTI3MDIEYXBwaWQDb0pfTWdwbklrWW5CMWhTZnFUZEd5TkouTXNxZlNMQmkEY2xpZW50A2Jvc3MEc2VydmljZQNCT1NTBHNsawN0aXRsZQRzcmNwdmlkA21VVGlta2dlQXUzeEYuM0xGQkQzR1pUU1FIS0dORXA4cUk4QUJJX1U-/SIG=12vhpskdd/**http%3A//www.monitor.co.ug/artman/publish/sports/SC_Villa_face_Simba_in_Tanzania_89289.shtml</clickurl>
            <date>2009/08/07</date>
            <language>english</language>
            <source>The Monitor</source>
            <sourceurl>http://www.monitor.co.ug/</sourceurl>
            <time>20:22:32</time>
            <title>SC Villa face Simba in Tanzania</title>
            <url>http://www.monitor.co.ug/artman/publish/sports/SC_Villa_face_Simba_in_Tanzania_89289.shtml</url>
        </result>

XPATH

doc.SelectNodes ("// result") не производит попаданий.

Ответы [ 2 ]

18 голосов
/ 08 августа 2009

Ответы Роба и Марка, вероятно, идут в правильном направлении - XmlDocument + пространства имен + XPath могут быть немного болезненными.

Если вы можете использовать .NET 3.5, я предлагаю вместо этого использовать LINQ to XML. Это сделало бы действительно легким:

XDocument doc = XDocument.Load("foo.xml");
XNamespace ns = "bar";
var results = doc.Descendants(ns + "result");

foreach (var result in results)
{
    ...
}

По моему мнению, LINQ to XML - это превосходный API практически во всех отношениях :) (Я полагаю, что ему не хватает некоторых возможностей, но если у вас есть доступ к .NET 3.5, его определенно стоит попробовать).

12 голосов
/ 08 августа 2009

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

doc.SelectNodes("//x:results/x:result", nsmgr);

(где x определено в nsmgr как псевдоним данного пространства имен)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...