如何在 C#/.net 中动态读取 XML 数据
本文关键字:动态 读取 XML 数据 net | 更新日期: 2023-09-27 18:35:43
如何动态读取 XML 数据?如何尽可能通用和动态地管理 C# 代码?根据要求,我需要在 XML 中添加更多文件夹路径,这不应该以必须重写的方式影响编写的代码。
给定一段 XML 作为示例:
<?xml version="1.0" standalone="yes"?>
<HOSTS>
<Host id = '1'>
<Extension>txt</Extension>
<FolderPath>C:/temp</FolderPath>
</Host>
<Host id = '2'>
<Extension>rar</Extension>
<FolderPath>C:/Sample</FolderPath>
</Host>
</HOSTS>
如何动态读取主机 ID?我有什么可能性?
是的
- 事实上,这在 C# 中是一个非常常见的任务。
有几种方法可以解决此问题:
- 使用库(如 XPath)读取 XML 值
- 将 XML 反序列化为对象
- 加载到 XMLDocument 对象中
- LINQ to XML(推荐)
这些链接应该为您指明正确的方向。
使用 LINQ to XML。
示例:使用 (id = 1) 检索主机:
string id = "1"
XDocument doc = XDocument.Load("data.xml");
var accounts = from elements in doc.Elements("HOSTS").Elements("Host")
where elements.Attribute("id").Value = id
select elements.FirstOrDefault();
从该示例 xml 生成 xsd 方案。根据需要对其进行修改,然后使用 xsd.exe 生成强类型 C# 类。
最好的办法是将 System.Xml.XmlDocument 类与 System.Xml.XmlDocument.Load(...) 一起用于构造函数。
在这种情况下,最好的方法(在我看来)是使用 XML 序列化来强类型类。您可以使用属性来控制流程。
var serializer = new XmlSerializer(typeof(Hosts));
var hosts = (Hosts)serializer.Deserialize(new StringReader(str));
。
[XmlRoot("HOSTS")]
public class Hosts : List<Host> {}
public class Host {
[XmlAttribute("id")]
public int Id { get; set; }
public string Extension { get; set; }
public string FolderPath { get; set; }
}