为什么这个XPath选择零节点?

时间:2014-01-15 14:42:46

标签: c# xml

我有这个XML:

<?xml version="1.0" encoding="utf-8"?>
<!-- Report generated by xxx -->
<report AppKey="stuffs" AppId="123">
  <physician name="AAA BBB">
     ....
     <services>
       <service id="1" diagnostic="345" />
       <service id="2" diagnostic="253" />
       <service id="3" diagnostic="585" />
     ....
     </services>
  </physician>
</report>

和这个c#代码

XmlDocument doc = new XmlDocument();
doc.Load(file);
XmlNodeList xnList = doc.SelectNodes("/report/physician/services/*");

我的问题是xnList总是空的,我尝试使用"/report/*"返回0,尝试使用"/report/physician/*"返回相同的内容,只有"*"返回整个xml文件。我想要做的是选择每个<service>,然后获取他们的属性。我似乎无法找到获取每个服务元素的方法,因为我的查询总是不返回任何内容。

4 个答案:

答案 0 :(得分:4)

您可以使用LINQtoXML吗?在这种情况下,它应该简单:

var doc = XDocument.Load(file);
XNamespace ns = "http://www.cnas.ro/siui/2.0";
var nodes = doc.Root.Element(ns + "physician")
                        .Element(ns + "services")
                            .Elements(ns + "service");

您还可以使用Descendants来获取匹配的节点,无论它们在树中的位置如何,如下所示:

var nodes = doc.Root.Descendants(ns + "service");

无论哪种方式,您都会得到一张可以轻松映射的IEnumerable<XElement>

N.B。记得在你的指令中添加using System.Xml.Linq;

<强>更新

为了映射到属性,这是一个意见问题......我会这样:

var services = from n in nodes
               select new
                   {
                       Id = n.Attribute("id").Value, 
                       Diagnostic = n.Attribute("diagnostic").Value
                   };

services将是IEnumerable<AnonymousType>,您可以随后进行迭代:

foreach (var service in services)
{
    Console.WriteLine(service.Id + " - " + service.Diagnostic);
}

答案 1 :(得分:2)

删除星号;

XmlNodeList xnList = doc.SelectNodes("/report/physician/services/service");

foreach (XmlNode service in xnList)
    x = service.Attributes["id"].Value;

答案 2 :(得分:1)

以下XPath应该适合您。

XmlNodeList xnList = doc.SelectNodes("/report/physician/services/service");

答案 3 :(得分:1)

这应该选择所有服务元素,无论它们在文件中的什么位置:

XmlNodeList xnList = doc.SelectNodes("//service");

单击here以查找更多XPath表达式