简体   繁体   English

LinQ 到 XML 访问元素及其值

[英]LinQ to XML access elements and their values

Sorry for my bad english...对不起,我的英语不好...

I try to get an enum of the elements "Member" and their values from my example XML-Code.我尝试从我的示例 XML 代码中获取元素“成员”及其值的枚举。 This Code is generated by an external program.此代码由外部程序生成。 i shrink this xml-file to an example.我将此 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>

i get down until the "Interface" Element, but beyond this i can not access the data.我下来直到“接口”元素,但除此之外我无法访问数据。

XElement xelement = XElement.Load(xmlPath);
IEnumerable<XElement> udtContent = xelement.Element("SW.Types.PlcStruct").Element("AttributeList").Element("Interface").Elements();

is this because of that xmlns namespace tag in that xml file?这是因为 xml 文件中的 xmlns 命名空间标记吗? if i debug now udtContent i get this:如果我现在调试 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>}

hope you can give me a hint how to get an enum of that "Member" elements...希望你能给我一个提示如何获得“成员”元素的枚举......

Namespace is the issue.命名空间是问题。 You can use code like this你可以使用这样的代码

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");
                }
            }
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM