如何使用 System.Xml.Linq 解析 xml 文件

Posted

技术标签:

【中文标题】如何使用 System.Xml.Linq 解析 xml 文件【英文标题】:How to parse xml file with System.Xml.Linq 【发布时间】:2014-09-07 05:06:43 【问题描述】:

我有一些数据存储在使用此http://www.codeproject.com/Tips/725375/Tiny-XML-Serialization-for-Cplusplus xml 序列化程序序列化的 xml 文件中。所以我的 Xml 文件看起来像:

类型 1:

<SerializableClass Type="ApplicationSettings" Version="2.1">
<Member Name="Setting1">Settings string 1</Member>
<Member Name="Setting2">Settings string 2</Member>
<Member Name="Setting3">Settings string 3</Member>
<Member Name="Setting4">1234</Member>
<Member Name="Setting5">5678</Member>
<Member Name="Setting6">false</Member>
<Member Name="Setting7">true</Member>
<Class Name="Login" Type="DatabaseLogin" Version="1">
    <Member Name="HostName">my.db.Settings.server.local</Member>
    <Member Name="Port">2000</Member>
    <Member Name="User">john.smith</Member>
    <Member Name="Password">newPassword</Member>
</Class>
<Collection Name="LastUsedDocuments">
    <Class Type="LastUsedDocument" Version="1">
        <Member Name="Name">Document #1</Member>
        <Member Name="Path">c:\temp\</Member>
        <Member Name="Size"></Member>
    </Class>
    <Class Type="LastUsedDocument" Version="1">
        <Member Name="Name">Document #2</Member>
        <Member Name="Path">c:\temp\</Member>
        <Member Name="Size"></Member>
    </Class>
    <Class Type="LastUsedDocument" Version="1">
        <Member Name="Name">Document #3</Member>
        <Member Name="Path">c:\temp\</Member>
        <Member Name="Size"></Member>
    </Class>
    <Class Type="LastUsedDocument" Version="1">
        <Member Name="Name">Document #4</Member>
        <Member Name="Path">c:\temp\</Member>
        <Member Name="Size"></Member>
    </Class>
    <Class Type="LastUsedDocument" Version="1">
        <Member Name="Name">Document #5</Member>
        <Member Name="Path">c:\temp\</Member>
        <Member Name="Size"></Member>
    </Class>
</Collection>

现在我想使用 System.xml.linq 工具解析此类 xml 文件,但我发现这并不容易,因为我需要检查每个“名称”属性以找出对象的类型。

我更容易阅读这种类型的 xml: 类型 2:

    <LastUsedDocuments>
    <LastUsedDocument>
        <Name>Document #1</Name>
        <Path>c:\temp\</Path>
        <Size></Size>
    </LastUsedDocument>
    <LastUsedDocument>
        <Name>Document #1</Name>
        <Path>c:\temp\</Path>
        <Size></Size>
    </LastUsedDocument>     
</LastUsedDocuments>

但是我无法重写所有的 xml 文件,所以我正在寻找一种方法来像读取这种类型 2 xml 一样容易地读取这种类型 1 的 xml 文件

您能帮我如何使用 system.xml.linq 吗?

【问题讨论】:

【参考方案1】:

我的首选方法是这样的:

using (MemoryStream ms = new MemoryStream(xmlByteBuffer))

  XElement root = XElement.Load(ms);

  IEnumerable<XElement> res =
      from el in root.Elements("Member")
      where (string)el.Attribute("Name") == "Setting1"
      select el;

编辑:您的 XML 似乎不正确。您的起始标签是“SerializableClass”,结束标签是“Collection”。您可能需要调整搜索,以便通过“集合”XElement 进行查询。 XElement child1 = root.Element("Collection");

【讨论】:

对不起,我没有正确(完全)复制它。非常感谢它的工作

以上是关于如何使用 System.Xml.Linq 解析 xml 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 System.Xml.Linq.XContainer.Element(...) 返回 null

如何反序列化 System.Xml.Linq.XElement?

将 System.Xml.Linq 与单声道命令行编译器一起使用

为啥 XNode 在 System.XML.Linq 命名空间而不是 System.XML?

System.IO.FileNotFoundException:无法加载文件或程序集System.Xml.Linq

在C#编程的时候,发现system.linq与system.xml.linq无法进行生成,错误原因是缺少引用?