C# 读写xml文件总结

    • C#写入xml文件
        • 1、XmlDocument
        • 2、DataSet对象里的值来生成XML文件
        • 3、利用XmlSerializer来将类的属性值转换为XML文件的元素值。
      • 示例:写入xml
        • 1、创建xml文档
        • 2 、增加节点
        • 3 、修改节点:
        • 4 、删除节点
    • c#读取xml文件

C#写入xml文件

1、XmlDocument

1。我认为是最原始,最基本的一种:利用XmlDocument向一个XML文件里写节点,然后再利用XmlDocument保存文件。
首先加载要写入的XML文件,但是如果没有的,就要新建,在新建的过程中,要有写入的代码;

XmlDocument doc = new XmlDocument();try{doc.Load("new.xml");}catch{XmlTextWriter xtw = new XmlTextWriter("new.xml", Encoding.UTF8);//新建XML文件xtw.WriteStartDocument();xtw.WriteStartElement("gnode");// gnode根节点 xtw.WriteStartElement("myxm1");// gnode根节点下的元素myxmls xtw.WriteEndElement();xtw.WriteEndElement();xtw.WriteEndDocument();xtw.Close();doc.Load("new.xml");}XmlNode xn = doc.DocumentElement;//找到根节点 XmlElement xe = doc.CreateElement("myxml2");//在根节点下创建元素,如果是属性,则用XmlAttribute; xe.InnerText = "薪薪代码hahaha";//给子节点写入文本节点(值) xn.AppendChild(xe);//根节点将其纳入 doc.Save("new2.xml");//利用XmlDocument保存文件}

注意点:在新建根节点的时候,WriteStartElement,只能嵌套,也就是只能有一个根节点。

2、DataSet对象里的值来生成XML文件

应用到数据库,将数据库的DataSet对象里的值来生成XML文件的元素;

using (SqlConnection con = new SqlConnection("Server=.;DataBase=HGSTUDY;uid=sa;pwd=yao")){con.Open();SqlCommand command = new SqlCommand("select * from GL_STUDY", con);command.CommandType = CommandType.Text;DataSet ds = new DataSet("DATASET");//DATASET将成为XML文件中的根节点名称,否则系统将其命名为NewDataSetSqlDataAdapter sda = new SqlDataAdapter();sda.SelectCommand = command;sda.Fill(ds, "DATATABLE");//DATATABLE为所生成XML文件中的子节点名称,否则系统将其命名为Table。 ds.WriteXml("dbxml.xml");// DataSet的方法WriteXml将数据写入到XML文件,就是这么一句话。如果不保存到文件,直接ds.GetXML()}

3、利用XmlSerializer来将类的属性值转换为XML文件的元素值。

用一个字符串作为一个XML文档中的xmlAttribute或xmlElement。[其元素或属性由类的定义来设置(xml串行化)]

using System;System.xml.Serialization;

  1. 先初始化一个类,设置属性值
var xmlDoc = new XmlDocument();//Create the xml declaration firstxmlDoc.AppendChild(xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null));//Create the root node and append into docvar el = xmlDoc.CreateElement("Contacts");xmlDoc.AppendChild(el);// ContactXmlElement elementContact = xmlDoc.CreateElement("Contact");XmlAttribute attrID = xmlDoc.CreateAttribute("id");attrID.Value = "01";elementContact.Attributes.Append(attrID);el.AppendChild(elementContact);// Contact NameXmlElement elementName = xmlDoc.CreateElement("Name");elementName.InnerText = "Daisy Abbey";elementContact.AppendChild(elementName);// Contact GenderXmlElement elementGender = xmlDoc.CreateElement("Gender");elementGender.InnerText = "female";elementContact.AppendChild(elementGender);xmlDoc.Save("test1.xml");
  1. 建XmlSerializer实例
class XXX { XmlSerializer ser = new XmlSerializer(Type.GetType("forxml.truck"));Truck tr = new Truck();tr.ID = 1; tr.cheID = "赣A T34923"; }
  1. Serialize方法–完成对类的串行化
XmlTextWriter xtw = new XmlTextWriter("myxml.xml",Encoding.UTF8); 用XmlTextWriter 创建一个XML文件ser.Serialize(xtw, tr); //如果只想显示,可以直接ser.Serialize(Console.Out, tr);}

xml常用方法:
定义xml文档:XmlDocument xmlDoc = new XmlDocument();
初始化xml文档:xmlDoc.Load(“D:\book.xml”);//找到xml文件
创建根元素:XmlElement xmlElement = xmlDoc.CreateElement(“”, “Employees”, “”);
创建节点:XmlElement xeSub1 = xmlDoc.CreateElement(“title”);
查找Employees节点:XmlNode root = xmlDoc.SelectSingleNode(“Employees”);
添加节点:xe1.AppendChild(xeSub1);
更改节点的属性:xe.SetAttribute(“Name”, “李明明”);
移除xe的ID属性:xe.RemoveAttribute(“ID”);
删除节点title:xe.RemoveChild(xe2);

示例:写入xml

1、创建xml文档

public void CreateXMLDocument(){XmlDocument xmlDoc = new XmlDocument();//加入XML的声明段落,XmlDeclaration xmlDeclar;xmlDeclar = xmlDoc.CreateXmlDeclaration("1.0", "gb2312", null);xmlDoc.AppendChild(xmlDeclar);//加入Employees根元素XmlElement xmlElement = xmlDoc.CreateElement("", "Employees", "");xmlDoc.AppendChild(xmlElement);//添加节点XmlNode root = xmlDoc.SelectSingleNode("Employees");XmlElement xe1 = xmlDoc.CreateElement("Node");xe1.SetAttribute("Name", "薪薪代码");xe1.SetAttribute("ISB", "2-3631-4");//添加子节点XmlElement xeSub1 = xmlDoc.CreateElement("title");xeSub1.InnerText = "学习VS";xe1.AppendChild(xeSub1);XmlElement xeSub2 = xmlDoc.CreateElement("price");xe1.AppendChild(xeSub2);XmlElement xeSub3 = xmlDoc.CreateElement("weight");xeSub3.InnerText = "20";xeSub2.AppendChild(xeSub3);root.AppendChild(xe1);xmlDoc.Save("D:\\book.xml");//保存的路径}

生成的xml文件如下:

<?xml version="1.0" encoding="GB2312"?>-<Employees>-  <Node ISB="2-3631-4" Name="薪薪代码">    <title>学习VS</title>-    <price>      <weight>20</weight>    </price>  </Node></Employees>

2 、增加节点

XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load("D:\\book.xml");//找到xml文件XmlNode root = xmlDoc.SelectSingleNode("Employees");//查找Employees节点XmlElement xe1 = xmlDoc.CreateElement("Node2");//添加Node2节点xe1.SetAttribute("Name", "张飞");XmlElement xeSub1 = xmlDoc.CreateElement("title");//定义子节点xeSub1.InnerText = "心情好";xe1.AppendChild(xeSub1);//添加节点到Node2root.AppendChild(xe1);//添加节点到EmployeesxmlDoc.Save("D:\\book.xml");

结果:

<?xml version="1.0" encoding="GB2312"?>  -<Employees>    -<Node ISB="2-3631-4" Name="薪薪代码">      <title>学习VS</title>-      <price>        <weight>20</weight>      </price>    </Node>-    <Node2 Name="张三">      <title>心情好</title>    </Node2>-    <Node2 Name="张三">      <title>心情好</title>    </Node2></Employees>

3 、修改节点:

public void ModifyNode(){XmlDocument xmlDocument = new XmlDocument();xmlDocument.Load("D:\\book.xml");XmlNodeList nodeList = xmlDocument.SelectSingleNode("Employees").ChildNodes;//获取Employees节点的所有子节点foreach (XmlNode xn in nodeList)//遍历{ XmlElement xe = (XmlElement)xn; if (xe.GetAttribute("Name") == "薪薪代码") { xe.SetAttribute("Name", "薪薪");//更改节点的属性 XmlNodeList xnl = xe.ChildNodes;//获取xe的所有子节点 foreach (XmlNode xn1 in xnl) {XmlElement xe2 = (XmlElement)xn1;//将节点xn1的属性转换为XmlElementif (xe2.Name == "title")//找到节点名字为title的节点{xe2.InnerText = "今天天气不好";}if (xe2.Name == "price"){XmlNodeList xnl2 = xe2.ChildNodes;foreach (XmlNode xn2 in xnl2){ if (xn2.Name == "weight") { xn2.InnerText = "88"; }}} } }}xmlDocument.Save("D:\\book2.xml");}

运行结果:

<?xml version="1.0" encoding="GB2312"?>-<Employees>-<Node ISB="2-3631-4" Name="薪薪"><title>今天天气不好</title>-<price><weight>88</weight></price></Node>-<Node2 Name="张三"><title>心情好</title></Node2></Employees>

4 、删除节点

public void DeleteNode(){XmlDocument xmlDocument = new XmlDocument();xmlDocument.Load("D:\\book1.xml");XmlNodeList xnl = xmlDocument.SelectSingleNode("Employees").ChildNodes;foreach (XmlNode xn in xnl){ if (xn.Name == "Node") { XmlElement xe = (XmlElement)xn;//将xn的属性转换为XmlElement xe.RemoveAttribute("ID");//移除xe的ID属性 XmlNodeList xnl2 = xe.ChildNodes; for (int i = 0; i < xnl2.Count; i++) {XmlElement xe2 = (XmlElement)xnl2.Item(i);if (xe2.Name == "title"){xe.RemoveChild(xe2);//删除节点title} } }}xmlDocument.Save("D:\\book3.xml");}

结果:

<?xml version="1.0" encoding="GB2312"?>-<Employees>-<Node ISB="2-3631-4" Name="薪薪">-<price><weight>20</weight></price></Node>-<Node2 Name="张三"><title>心情好</title></Node2>-<Node2 Name="张三"><title>心情好</title></Node2></Employees>

c#读取xml文件

xml文件如下:

<?xml version="1.0" encoding="utf-8" ?><configurationN><ServerAddress>1143</ServerAddress><ID>192.168</ID></configurationN>

在写入xml文件时,最主要使用了两个方法:Load和Save。

Load:初始化xml文档,以便项目文件获取具体的xml节点的值。

public void Load(string path){try{ XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(path); XmlNodeList xnl = xmlDocument.SelectSingleNode(managerNode).ChildNodes; foreach (XmlNode xn in xnl) { if (xn.Name == configuration_ServerAddress) {ServerAddress = xn.InnerText; } }}catch(Exception ex){ }}

Save:在项目系统中进行修改配置文件值后,需要对xml进行重新保存

public void Save(string path){try{ XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(path); XmlNodeList xnl = xmlDocument.SelectSingleNode(managerNode).ChildNodes; foreach (XmlNode xn in xnl) { if (xn.Name == configuration_ServerAddress) {xn.InnerText = ServerAddress; } } xmlDocument.Save(path);}catch (Exception ex){ }}

此处将所有代码都贴出来,方便下次实现。因为项目是WPF文件,而且都是简单控件,所以只贴出后台代码。

class ConfigurationManager:INotifyPropertyChanged{public const string managerNode = "configurationN";//根节点public const string configuration_ServerAddress = "ServerAddress";//子节点private string _ServerAddress;public string ServerAddress{get { return _ServerAddress; }set{_ServerAddress = value;NotifyPropertyChanged("ServerAddress");}}public void Load(string path){try{XmlDocument xmlDocument = new XmlDocument();xmlDocument.Load(path);XmlNodeList xnl = xmlDocument.SelectSingleNode(managerNode).ChildNodes;foreach (XmlNode xn in xnl){if (xn.Name == configuration_ServerAddress){ServerAddress = xn.InnerText;}}}catch(Exception ex){ }}public void Save(string path){try{XmlDocument xmlDocument = new XmlDocument();xmlDocument.Load(path);XmlNodeList xnl = xmlDocument.SelectSingleNode(managerNode).ChildNodes;foreach (XmlNode xn in xnl){if (xn.Name == configuration_ServerAddress){xn.InnerText = ServerAddress;}}xmlDocument.Save(path);}catch (Exception ex){ }}public event PropertyChangedEventHandler PropertyChanged;private void NotifyPropertyChanged(string propertyName){if (PropertyChanged != null){PropertyChanged(this, new PropertyChangedEventArgs(propertyName));}}public static ConfigurationManager Instance = new ConfigurationManager();}public partial class MainWindow : Window{public MainWindow(){InitializeComponent();Start();this.tb1.Text = ConfigurationManager.Instance.ServerAddress.ToString();}private string path = "CONFIG\\System.xml";private void button1_Click(object sender, RoutedEventArgs e){ConfigurationManager.Instance.ServerAddress = this.tb1.Text;ConfigurationManager.Instance.Save(path);}private void button2_Click(object sender, RoutedEventArgs e){Application.Current.Shutdown();}private void Start(){ConfigurationManager.Instance.Load(path);}}