从属性值解析xml命名空间

时间:2014-07-28 16:45:09

标签: c# linq-to-xml xelement

给出以下xml(简化)

<root xmlns="http://schemas.datacontract.org/2004/07/Base" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Items>
        <item xmlns:a="http://schemas.datacontract.org/2004/07/Base" i:type="a:A"></item>
        <item xmlns:a="http://schemas.datacontract.org/2004/07/Base" i:type="a:B"></item>
    </Items>
</root>

我正试图沿着这条线做点什么。

XNamespace xmlInstanceNs = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace baseNs = "http://schemas.datacontract.org/2004/07/Base";
var items = root.Descendants(baseNs + "item");
var aItems = items.Where(i => i.Attribute(xmlInstanceNs + "type").Value == baseNs + "A");

当然这不起作用,因为最后一行基本上是将字符串“a:A”与XName“{http://schemas.datacontract.org/2004/07/Base} A”进行比较。它们不相同。

有没有办法将“a:A”字符串解析为其XName等价物,而无需手动迭代xml以查找所有命名空间缩写?

1 个答案:

答案 0 :(得分:1)

http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.getnamespaceofprefix%28v=vs.110%29.aspx因此您应该可以进行比较

items.Where(i => 
  baseNs  + "A" == 
  i.GetNamespaceOfPrefix(i.Attribute(xmlInstanceNs + "type").Value.Split(new Char[] { ':' })[0]) + "A")