Linq to XML可以使用冒号吗?

时间:2011-05-27 15:15:36

标签: c# linq-to-xml

var count = (from p in xmlDoc.Descendants("env:SE04Overprinting")
select p).Count();

引发异常(有点,它在到达时崩溃,但使用手表显示此错误)

xmlDoc.Descendants("env:SE04Overprinting")
  

'“env:SE04Overprinting”'抛出类型'System.Xml.XmlException'System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>

的异常

我在这个错误上做了一些调查,但没有发现任何东西,然后试图摆脱冒号:

var count = (from p in xmlDoc.Descendants("env")
select p).Count();
这是有效的。将冒号从文件中剥离出来只是解决这个问题吗?

2 个答案:

答案 0 :(得分:7)

如果您的XML正确声明了命名空间,您可以这样做:

XNamespace env = "http://namespaceinXml";
var count = (from p in xmlDoc.Descendants(env + "SE04Overprinting")...

示例:

<foo xmlns:env="http://foo.bar">
  <env:bar>test</env:bar>
</foo>

由于bar位于env命名空间内,您可以像这样检索其值:

XDocument xdoc = XDocument.Load("test.xml");
XNamespace env = "http://foo.bar";
string bar = xdoc.Descendants(env+"bar").First().Value; //returns test

确保XNamespace声明完全匹配 XML中命名空间的值。

答案 1 :(得分:2)

您似乎将该冒号视为您要检索的元素名称的一部分。它不是,它是命名空间前缀和本地名称之间的分隔符。

没有名称空间声明,env:毫无意义。您需要在本地名称(在您的情况下为“SE04Overprinting”)前加上实际命名空间(在您要查找的节点上方的某处查找xmlns:env=)。

请参阅XName documentation

中的“在名称空间中创建XName”一节