C#XmlDocument SelectNodes

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

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

但是,* XmlDocument.SelectNodes(“// results / result”)什么都没找到。
* XmlDocument.SelectNodes(“// result”)什么都没找到。

我和一位同事谈过,他在XmlDocument.SelectNodes中使用Xpath感到很悲伤。 还有其他人遇到过这种问题吗? 有解决方案?

XML文件:

   true  49 47 2579    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. 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 english The Monitor http://www.monitor.co.ug/ 20:22:32 SC Villa face Simba in Tanzania http://www.monitor.co.ug/artman/publish/sports/SC_Villa_face_Simba_in_Tanzania_89289.shtml  

XPATH

doc.SelectNodes(“// result”)不会产生任何命中。

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,根据我的经验:)(我相信它有一些function,但是如果你有权访问.NET 3.5,那么至少值得尝试。)

听起来像命名空间是问题; 您通常需要为此获得XmlNamespaceManager的帮助,并在查询中使用别名,即

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

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