【问题标题】:Parsing XML using Linq in .Net with attribute prefix values在.Net中使用Linq解析XML,带有属性前缀值
【发布时间】:2018-05-11 22:26:18
【问题描述】:

我是 .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>

Linq 查询

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));

【问题讨论】:

标签: c# .net


【解决方案1】:

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

  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));

【讨论】:

    猜你喜欢
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多