如何使用 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?