从属性值解析xml名称空间

本文关键字:空间 xml 从属性 | 更新日期: 2023-09-27 18:15:29

给定以下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以查找所有名称空间缩写?

从属性值解析xml名称空间

有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")