C#XmlDocument SelectNodes

C#XmlDocument SelectNodes,c#,xml,xpath,C#,Xml,Xpath,我有一个包含根元素、两个子元素“诊断”和“结果”的xml文档。“results”元素具有任意数量的名为“result”的元素 当它被加载到一个XmlDocument中时,可以很容易地浏览该结构,并看到这正是事情的运作方式。我可以编写一个递归函数来挑选所有的“结果”元素。XmlDocument.SelectNodes(//results)发现一个节点没有问题 但是,, *SelectNodes(//results/result)找不到任何内容。 *SelectNodes(//结果)找不到任何内容

我有一个包含根元素、两个子元素“诊断”和“结果”的xml文档。“results”元素具有任意数量的名为“result”的元素

当它被加载到一个XmlDocument中时,可以很容易地浏览该结构,并看到这正是事情的运作方式。我可以编写一个递归函数来挑选所有的“结果”元素。XmlDocument.SelectNodes(//results)发现一个节点没有问题

但是,, *SelectNodes(//results/result)找不到任何内容。
*SelectNodes(//结果)找不到任何内容

我和一位同事谈过,他对在XmlDocument.SelectNodes中使用Xpath感到很难过。还有谁遇到过这样的问题吗?有什么解决办法吗

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>

真的
49
47
2579
卡昆古鲁杯冠军SC维拉队今天下午在达累斯萨拉姆国家体育场迎战坦桑尼亚的辛巴SC队。加藤说:“我们经历了一段非常累的旅程。道路很糟糕,路障太多。然而,我们最终到达了目的地,但孩子们太累了。”。
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
2009/08/07
英语
监视器
http://www.monitor.co.ug/
20:22:32
SC别墅面对坦桑尼亚辛巴
http://www.monitor.co.ug/artman/publish/sports/SC_Villa_face_Simba_in_Tanzania_89289.shtml
XPATH


doc.SelectNodes(//result”)不会产生点击。

我觉得名称空间是问题所在;为此,通常需要获得
XmlNamespaceManager
的帮助,并在查询中使用别名,即

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

(其中,
x
nsmgr
中定义为给定名称空间的别名)

Rob和Marc的答案可能是正确的-XmlDocument+名称空间+XPath可能有点麻烦

如果您能够使用.NET3.5,我建议您改用LINQtoXML。这将使它变得非常简单:


基本上,根据我的经验,LINQ to XML在几乎所有方面都是一个优秀的API:)(我相信它缺少一些功能,但如果你能访问.NET 3.5,至少肯定值得一试。)

谢谢Mark,正是这样。谢谢Jon,我确实切换到了LINQ,它更棒了!:)这一个是为我做的,但XNamespace部分是我的问题。我不想给乔恩·斯基特更多的分数。。。但是“长尾”等等。@John:如果有什么安慰的话,你的投票没有给我更多的代表权。我大约9小时前达到了代表权上限。@Jon大约在00:01,我想:)我希望我有这样的代表权问题:你有相关xml的样本吗?您的“result”元素是否可能与“results”元素位于不同的命名空间中?元素上是否有限定前缀?
XDocument doc = XDocument.Load("foo.xml");
XNamespace ns = "bar";
var results = doc.Descendants(ns + "result");

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