使用 Linq 在 .Net 中使用属性前缀值分析 XML



我是一个新手,在.NET中解析Linq。我可能有一个简单的问题,我希望有人能快速为我回答。我有一个巨大的xml,我已经压缩下来以找出查询失败的原因。我需要从包含属性类型的节点中的 xml 中解析元素。查询需要与属性类型匹配,并返回元素名称的元素值。但是,我遇到的问题是,我的 xml 在属性名称和元素名称之前有 d: 前缀,我的 Linq 查询只是窒息了它。如果我从 xml 和查询字符串中删除 d: 前缀,它可以工作并返回正确的值,但带有前缀则不起作用。有人可以查看我的 Linq 查询并查看我在前缀上做错了什么吗?

精简的 xml 代码

<root>
<Contact xmlns:c="http://test/common/1.0">
<c:IBase type="d:testInfo" xmlns:d="http://">
<d:ActivityID>00000</d:ActivityID>
</c:IBase>
<c:IBase type="d:testInfo" xmlns:d="http://">
<d:ActivityID>00001</d:ActivityID>
</c:IBase>
</Contact>
</root>

林克查询

var node = from el in xml.Descendants("IBase")
where 
el.Attribute("type").Value == "testInfo"
select el.Element("ActivityID").Value;
foreach ( String s in node )
Console.WriteLine(string.Format("Id= {0}",s));

这里有两个问题需要解决。

  1. 您需要指定命名空间作为查询的一部分,正如 Bradley Uffner 在他的评论中提到的。
  2. type实际上有一个"d:",它不是一个命名空间,因为它在属性的值中,所以你需要与"d:testInfo"进行比较,而不仅仅是"testInfo"

请尝试以下操作:

XDocument xml = XDocument.Parse(myXmlString);
XNamespace xnc = "http://test/common/1.0";
XNamespace xnd = "http://";
var node = from el in xml.Descendants(xnc + "IBase")
where 
el.Attribute("type").Value == "d:testInfo"
select el.Element(xnd + "ActivityID").Value;
foreach ( String s in node )
Console.WriteLine(string.Format("Id= {0}",s));

最新更新