LinQ to XML 访问元素及其值
LinQ to XML access elements and their values
抱歉我的英语不好...
我尝试从我的示例 XML-代码中获取元素 "Member" 及其值的枚举。此代码由外部程序生成。我将此 xml 文件缩小为示例。
<?xml version="1.0" encoding="utf-8"?>
<Document>
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface>
<Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v4">
<Section Name="None">
<Member Name="FirstMember" Datatype="Word"><AttributeList><BooleanAttribute Name="ExternalAccessible" SystemDefined="true">true</BooleanAttribute></AttributeList><Comment><MultiLanguageText Lang="de-DE">FirstMemberComment</MultiLanguageText></Comment></Member>
<Member Name="SecondMember" Datatype="Word"><AttributeList><BooleanAttribute Name="ExternalAccessible" SystemDefined="true">true</BooleanAttribute></AttributeList><Comment><MultiLanguageText Lang="de-DE">SecondMemberComment</MultiLanguageText></Comment></Member>
</Section>
</Sections>
</Interface>
</AttributeList>
</SW.Types.PlcStruct>
</Document>
我一直到 "Interface" 元素,但除此之外我无法访问数据。
XElement xelement = XElement.Load(xmlPath);
IEnumerable<XElement> udtContent = xelement.Element("SW.Types.PlcStruct").Element("AttributeList").Element("Interface").Elements();
这是因为 xml 文件中的 xmlns 命名空间标签吗?
如果我现在调试 udtContent 我得到这个:
{<Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v4">
<Section Name="None">
<Member Name="FirstMember" Datatype="Word">
<AttributeList>
<BooleanAttribute Name="ExternalAccessible" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
<Comment>
<MultiLanguageText Lang="de-DE">FirstMemberComment</MultiLanguageText>
</Comment>
</Member>
<Member Name="SecondMember" Datatype="Word">
<AttributeList>
<BooleanAttribute Name="ExternalAccessible" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
<Comment>
<MultiLanguageText Lang="de-DE">SecondMemberComment</MultiLanguageText>
</Comment>
</Member>
</Section>
</Sections>}
希望你能给我一个提示,说明如何获取 "Member" 个元素的枚举...
名称空间是问题所在。您可以使用这样的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication2
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
List<XElement> members = doc.Descendants().Where(x => x.Name.LocalName == "Member").ToList();
XNamespace ns = members.FirstOrDefault().GetDefaultNamespace();
foreach (XElement member in members)
{
foreach (XElement booleanAttribute in member.Descendants(ns + "BooleanAttribute"))
{
string name = (string)booleanAttribute.Attribute("Name");
}
}
}
}
}
抱歉我的英语不好...
我尝试从我的示例 XML-代码中获取元素 "Member" 及其值的枚举。此代码由外部程序生成。我将此 xml 文件缩小为示例。
<?xml version="1.0" encoding="utf-8"?>
<Document>
<SW.Types.PlcStruct ID="0">
<AttributeList>
<Interface>
<Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v4">
<Section Name="None">
<Member Name="FirstMember" Datatype="Word"><AttributeList><BooleanAttribute Name="ExternalAccessible" SystemDefined="true">true</BooleanAttribute></AttributeList><Comment><MultiLanguageText Lang="de-DE">FirstMemberComment</MultiLanguageText></Comment></Member>
<Member Name="SecondMember" Datatype="Word"><AttributeList><BooleanAttribute Name="ExternalAccessible" SystemDefined="true">true</BooleanAttribute></AttributeList><Comment><MultiLanguageText Lang="de-DE">SecondMemberComment</MultiLanguageText></Comment></Member>
</Section>
</Sections>
</Interface>
</AttributeList>
</SW.Types.PlcStruct>
</Document>
我一直到 "Interface" 元素,但除此之外我无法访问数据。
XElement xelement = XElement.Load(xmlPath);
IEnumerable<XElement> udtContent = xelement.Element("SW.Types.PlcStruct").Element("AttributeList").Element("Interface").Elements();
这是因为 xml 文件中的 xmlns 命名空间标签吗? 如果我现在调试 udtContent 我得到这个:
{<Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v4">
<Section Name="None">
<Member Name="FirstMember" Datatype="Word">
<AttributeList>
<BooleanAttribute Name="ExternalAccessible" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
<Comment>
<MultiLanguageText Lang="de-DE">FirstMemberComment</MultiLanguageText>
</Comment>
</Member>
<Member Name="SecondMember" Datatype="Word">
<AttributeList>
<BooleanAttribute Name="ExternalAccessible" SystemDefined="true">true</BooleanAttribute>
</AttributeList>
<Comment>
<MultiLanguageText Lang="de-DE">SecondMemberComment</MultiLanguageText>
</Comment>
</Member>
</Section>
</Sections>}
希望你能给我一个提示,说明如何获取 "Member" 个元素的枚举...
名称空间是问题所在。您可以使用这样的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication2
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
List<XElement> members = doc.Descendants().Where(x => x.Name.LocalName == "Member").ToList();
XNamespace ns = members.FirstOrDefault().GetDefaultNamespace();
foreach (XElement member in members)
{
foreach (XElement booleanAttribute in member.Descendants(ns + "BooleanAttribute"))
{
string name = (string)booleanAttribute.Attribute("Name");
}
}
}
}
}