我有这个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>
,然后获取他们的属性。我似乎无法找到获取每个服务元素的方法,因为我的查询总是不返回任何内容。
答案 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)