LinQ to XML访问元素及其值

问题描述 投票:0回答:1

对不起,我的英语不好...

我尝试从示例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>

我下来直到“接口”元素,但除此之外,我无法访问数据。

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>}

希望您能给我提示如何获取该“成员”元素的枚举...

c# xml namespaces xelement
1个回答
0
投票

命名空间是问题。您可以使用这样的代码

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");
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.