C# XmlDocument SelectNodes

8

我有一个带有根元素和两个子元素'diagnostic'和'results'的XML文档。'results'元素然后具有任意数量的名称为'result'的元素。

当这个文档加载到XmlDocument中时,很容易导航结构并看到这正是事情的运作方式。我可以编写一个递归函数来选择所有的"result"元素。 XmlDocument.SelectNodes("//results")没有问题地找到节点。

然而, * XmlDocument.SelectNodes("//results/result") 什么都没找到。
* XmlDocument.SelectNodes("//result") 什么都没找到。

我已经跟同事交流过了,他在使用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>

XPATH

doc.SelectNodes("//result") 没有返回结果。


你有相关的XML示例吗?你的“result”元素可能与“results”元素位于不同的命名空间中吗?这些元素上是否有任何限定前缀? - Rob Levine
2个回答

19

Rob和Marc的回答可能是正确的方向 - 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 的卓越 API :) (我相信它还有一些缺失的功能,但如果你可以访问 .NET 3.5,至少值得尝试一下。)


谢谢Jon,我已经转换到LINQ了,感觉好多了! :) - Daniel
这个对我有用,但是XNamespace部分是我的问题所在。我讨厌再给Jon Skeet任何积分...但是,长尾和所有的东西。 - John Gardner
3
如果有安慰的话,你的点赞并没有让我获得更多的声望。我大约9小时前就达到了声望上限。 - Jon Skeet
@Jon 大概在00:01左右吧 :) 我希望我也有那种声望问题 :D - John Gardner

12

我认为问题在于命名空间;通常你需要借助一个XmlNamespaceManager并在查询中使用别名来解决这个问题,例如:

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

(其中xnsmgr中定义为给定命名空间的别名)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接