天天看点

C# 读取XML文件的几种方式

在开发过程中,我们有时会需要保存到本地一些结构化数据或者配置信息,这时就可以选择用xml文件。当然xml的用途也不仅仅是这些。

我们有以下两个文件,一个是带有id属性的,一个是不带属性的简单xml文件。

<?xml version="1.0" encoding="utf-8" ?>
<studentList>
	<student>
		<name>张三</name>
		<sex>男</sex>
		<old>20</old>
	</student>
	<student>
		<name>李四</name>
		<sex>女</sex>
		<old>21</old>
	</student>
</studentList>
           
<?xml version="1.0" encoding="utf-8" ?>
<studentList>
	<student>
		<name id="1">张三</name>
		<sex id="11">男</sex>
		<old id="111">20</old>
	</student>
	<student>
		<name id="2">李四</name>
		<sex id="22">女</sex>
		<old id="222">21</old>
	</student>
</studentList>
           

第一种方式:DataSet读取

这种方式最简单,而且取数据也很方便,但是对于比较复杂的xml,操作起来也很麻烦,每一个带属性的节点都会生成一个table,可以自行监视下DataSet的结构情况,然后做不同的处理

//xml文件路径
 string xmlPath = Application.StartupPath + "\\Student.xml";//不带属性
 string xmlPaths = Application.StartupPath + "\\Students.xml";//带属性
 //dataset读取简单xml文件
 DataSet ds = new DataSet();
 ds.ReadXml(xmlPath);
//读取第一条数据的name节点
 string name = ds.Tables[0].Rows[0]["name"].ToString();
 //输出:张三
 Console.WriteLine(name);


 //dataset读取带属性的xml文件
 ds = new DataSet();
 ds.ReadXml(xmlPaths);
 //读取的节点名称
 string nodeName = "name";
 name = ds.Tables[nodeName].Rows[0][nodeName+"_Text"].ToString();
 //读取节点的id属性
 string id = ds.Tables[nodeName].Rows[0]["id"].ToString();
 //输出:id:1,name:张三
 Console.WriteLine("id:{0},name:{1}",id,name);
           

第二种方式:XmlDocument

这种方式就很强大并且灵活了,根据节点顺序逐步获取就可以

//需导入命名空间 
using System.Xml;

//XmlDocument读取xml文件
 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.Load(xmlPaths);
 
 //获取xml根节点
 XmlNode xmlRoot = xmlDoc.DocumentElement;
 //根据节点顺序逐步读取
 //读取第一个name节点
 name = xmlRoot.SelectSingleNode("student/name").InnerText;
 
 //读取节点的id属性
 id = xmlRoot.SelectSingleNode("student/name").Attributes["id"].InnerText;
 //输出:id:1,name:张三
 Console.WriteLine("id:{0},name:{1}", id, name);

 //读取所有的name节点
 foreach (XmlNode node in xmlRoot.SelectNodes("student/name"))
 {
     //循环输出
     Console.WriteLine("id:{0},name:{1}", node.Attributes["id"].InnerText, node.InnerText);
 }
           

第三种方式:JSON.NET

使用JSON.NET可以将xml转换成json去操作

如果是对xml文件进行操作的话,个人不太建议使用这种方式;

需要引入Newtonsoft.Json.dll,使用时请注意版本,低版本可能不支持

//需导入命名空间 
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

 //XmlDocument读取xml文件
 xmlDoc = new XmlDocument();
 xmlDoc.Load(xmlPaths);
 //转换为json
 string json = JsonConvert.SerializeXmlNode(xmlDoc);
 //解析json
 JObject jobj = JObject.Parse(json);
 JArray jarr = JArray.Parse(jobj["studentList"]["student"].ToString());
 //输出:id:1,name:张三
 Console.WriteLine("id:{0},name:{1}", jarr[0]["name"]["#text"], jarr[0]["name"]["@id"]);
           

简单的xml文件个人推荐使用第一种,复杂点的使用第二种,具体可以根据需求选择。