在XElement hwLibs中使用以下XML。
<ConnectedHardwareLibraries xmlns="CBOpenIFSchema3_0">
<ConnectedHardwareLibrary Name="BasicHwLib" MajorVersion="6" MinorVersion="0" Revision="0" FilePath="HWLibraries:" />
<ConnectedHardwareLibrary Name="CI854PROFIBUSHwLib" MajorVersion="2" MinorVersion="11" Revision="40" FilePath="HWLibraries:" />
</ConnectedHardwareLibraries>我希望获得具有Name="CI854PROFIBUSHwLib"属性的库元素。
<ConnectedHardwareLibrary Name="CI854PROFIBUSHwLib" MajorVersion="2" MinorVersion="11" Revision="40" FilePath="HWLibraries:" />通过以下查询,将呈现预期的结果。
IEnumerable<XElement> x =
from item in hwLibs.Descendants()
where item.Attribute("Name").Value.Equals("CI854PROFIBUSHwLib")
select item;但是下面的代码返回一个空结果。
IEnumerable<XElement> x =
from item in hwLibs.Descendants("ConnectedHardwareLibrary")
where item.Attribute("Name").Value.Equals("CI854PROFIBUSHwLib")
select item;为什么?
发布于 2019-08-16 17:45:59
您的示例XML文档有一个默认名称空间"CBOpenIFSchema3_0“。这意味着文档的所有元素都将具有该名称空间,如果没有另外指定的话。
因此,这就是为什么当您使用Descendants方法指定一个包含本地元素名称"ConnectedHardwareLibrary“且没有名称空间的参数时,它将不匹配任何内容。
您可以将代码更改为使用包含命名空间的元素名称进行查询,如下所示:
IEnumerable<XElement> x =
from item in hwLibs.Descendants("{CBOpenIFSchema3_0}ConnectedHardwareLibrary")
where item.Attribute("Name").Value.Equals("CI854PROFIBUSHwLib")
select item;或者,还有其他几种不同的语法可以做同样的事情:
XNamespace ns = "CBOpenIFSchema3_0";
IEnumerable<XElement> x =
from item in hwLibs.Descendants(ns + "ConnectedHardwareLibrary")
where item.Attribute("Name").Value.Equals("CI854PROFIBUSHwLib")
select item;IEnumerable<XElement> x =
from item in hwLibs.Descendants(XName.Get("ConnectedHardwareLibrary","CBOpenIFSchema3_0")
where item.Attribute("Name").Value.Equals("CI854PROFIBUSHwLib")
select item;https://stackoverflow.com/questions/57522197
复制相似问题