Linq-to-XML可以使用冒号吗

本文关键字:可以使 Linq-to-XML | 更新日期: 2023-09-27 17:57:45

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

抛出一个异常(有点像,它在到达那里时崩溃了,但使用手表会显示这个错误(

xmlDoc.Descendants("env:SE04Overprinting")

"env:SE04套印"引发了类型为"System.Xml.XmlException"System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement> 的异常

我对这个错误做了一些查找,但没有找到任何东西,然后尝试去掉冒号:

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

这是有效的。从文件中去掉冒号是解决这个问题的唯一方法吗?

Linq-to-XML可以使用冒号吗

如果您的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中命名空间的值完全匹配

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

如果没有命名空间声明,env:就没有意义。您需要在本地名称(在您的情况下为"SE04Overprinting"(前面加上实际的命名空间(查找xmlns:env=,在您要查找的节点上方的某个位置(。

请参阅XName文档

中的"在命名空间中创建XName"一节