【问题标题】:LinQ to XML access elements and their valuesLinQ to XML 访问元素及其值
【发布时间】:2020-09-23 01:07:08
【问题描述】:

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

我尝试从我的示例 XML 代码中获取元素“成员”及其值的枚举。此代码由外部程序生成。我将此 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】:

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

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

    【讨论】:

    • 感谢您的帮助,这开箱即用,现在对我来说很容易理解。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多