一,XML规范

1 <?xml version="1.0" encoding="utf-8"?>
2 <Contacts><!--注释-->
3   <Contact id="01">
4     <Name>Daisy Abbey</Name>
5     <Gender>female</Gender>
6   </Contact>
7 </Contacts>

第一行是XML文档的声明,主要由两个部分组成:
   version:文档符合XML1.0规范。
   encoding:文档字符编码,默认为"UTF-8"

注释:使用<!--内容-->格式,无法被嵌套
标签:自定义的,包括属性
注意:XML是一种标记语言,严格区分大小写,必须成对出现,注意结尾的反斜杠
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

二,C#创建XML文件

1.使用XmlDocument.
1.使用XmlDocument.

       使用XmlDocument是一种基于文档结构模型的方式来读取XML文件.在XML文件中,我们可以把XML看作是由文档声明(Declare),元素(Element),属性(Attribute),文本(Text)等构成的一个树.最开始的一个结点叫作根结点,每个结点都可以有自己的子结点.得到一个结点后,可以通过一系列属性或方法得到这个结点的值或其它的一些属性.例如:
   1: xn 代表一个结点
   2: xn.Name;  //这个结点的名称
   3: xn.Value;  //这个结点的值
   4: xn.ChildNodes;  //这个结点的所有子结点
   5: xn.ParentNode;  //这个结点的父结点
   6: .......
1.1 读取所有的数据.
使用的时候,首先声明一个XmlDocument对象,然后调用Load方法,从指定的路径加载XML文件.
   1: XmlDocument doc =   new XmlDocument();
   2: doc.Load(  @"..\..\Book.xml" );
     然后可以通过调用SelectSingleNode得到指定的结点,通过GetAttribute得到具体的属性值.
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

  例子:

1         /// <summary>
 2         /// 添加XML文件
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void btn_AddXMLFolder_Click(object sender, EventArgs e)
 7         {
 8             // 在内存中创建XmlDocument对象
 9             XmlDocument document = new XmlDocument();
10             // 增加文档说明
11             XmlDeclaration declaration = document.CreateXmlDeclaration("1.0", "UTF-8", "");//xml文档的声明部分
12             // 添加至XmlDocument对象中
13             document.AppendChild(declaration);
14 
15             // 赋值
16             User user = new User() { ID = 1, Name ="张三", Sex = true, Age = "16岁" };
17             // 创建根节点User
18             XmlElement hUser = document.CreateElement("User");//CreateElement(节点名称)
19             // 设置根节点的属性
20             hUser.SetAttribute("Type", "员工");
21             // 创建子节点ID
22             XmlElement ID = document.CreateElement("ID");
23             ID.InnerText = user.ID.ToString(); //设置其值
24             XmlElement Name = document.CreateElement("Name");
25             Name.InnerText = user.Name;
26             XmlElement Sex = document.CreateElement("Sex");
27             Sex.InnerText = (user.Sex== true)? "男":"女";
28             XmlElement Age = document.CreateElement("Age");
29             Age.InnerText = user.Age;
30             // 添加至父节点User中
31             hUser.AppendChild(ID);
32             hUser.AppendChild(Name);
33             hUser.AppendChild(Sex);
34             hUser.AppendChild(Age);
35             // 将根节点添加至XML文档中
36             document.AppendChild(hUser);
37 
38             // 保存输出路径
39             document.Save(@"C:\folder\XMLFile1.xml");
40         }
41         /// <summary>
42         /// User信息类
43         /// </summary>
44         public class User
45         {
46             // ID
47             public int ID { get; set; }
48             // 姓名
49             public string Name { get; set; }
50             // 性别
51             public bool Sex { get; set; }
52             // 年龄
53             public string Age { get; set; }
54         }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.

View Code

2.使用Linq to XML.-XElement

   Linq是C#3.0中出现的一个新特性,使用它可以方便的操作许多数据源,也包括XML文件.使用Linq操作XML文件非常的方便,而且也比较简单。

2.1创建
1        /// <summary>
 2         /// 通过xdocument写入文件
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void btn_addXmlfile_Click(object sender, EventArgs e)
 7         {
 8             // 通过xdocument写入文件
 9             List<Person> list = new List<Person>();
10             list.Add(new Person() { Name = "Sam", Age = 18 });
11             list.Add(new Person() { Name = "Penny", Age = 20 });
12             // 1、创建Dom对象。
13             XDocument xDoc = new XDocument();
14             XDeclaration xDec = new XDeclaration("1.0", "utf-8", null);
15             // 设置文档定义
16             xDoc.Declaration = xDec;
17             // 2、创建根节点
18             XElement rootElement = new XElement("List");
19             xDoc.Add(rootElement);
20             // 3、循环创建节点
21             for (int i = 0; i < list.Count; i++)
22             {
23                 XElement PersonElement = new XElement("Person");
24                 PersonElement.SetAttributeValue("id", (i + 1).ToString());
25 
26                 PersonElement.SetElementValue("Name", list[i].Name);
27                 PersonElement.SetElementValue("Age", list[i].Age);
28                 rootElement.Add(PersonElement);
29             }
30             xDoc.Save(@"C:\Users\zhang-sh\source\repos\repo\repo\folder\List.xml");
31         }
32         /// <summary>
33         /// Person类
34         /// </summary>
35         public class Person
36         {
37             public string Name { get; set; }
38             public int Age { get; set; }
39         }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.

View Code

2.2读取
1         /// <summary>
 2         /// 读取方法一 XDocument
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void btn_Read_Click(object sender, EventArgs e)
 7         {
 8             // 加载xml文件
 9             XDocument xDocument = XDocument.Load(@"C:\Users\zhang-sh\source\repos\repo\repo\folder\XMLFile1.xml");  //从指定的位置加载xml文档  System.Environment.CurrentDirectory默认路径bin-debug下
10             // 获取根节点
11             XElement xElement= xDocument.Root;  //xDocument.Root获取文档的跟XElement
12 
13             System.Diagnostics.Debug.WriteLine("ID:"+xElement.Element("ID").Value);
14             System.Diagnostics.Debug.WriteLine("Name:" + xElement.Element("Name").Value);
15             System.Diagnostics.Debug.WriteLine("Sex:" + xElement.Element("Sex").Value);
16             System.Diagnostics.Debug.WriteLine("Age:" + xElement.Element("Age").Value);
17         }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

View Code

3.使用XmlTextReader和XmlTextWriter
3.1使用XmlTextReader读取数据的时候,首先创建一个流,然后用read()方法来不断的向下读,根据读取的结点的类型来进行相应的操作.
1     /// <summary>
 2         /// 读取方法二 XmlTextReader(文档流的读取方式,只读)
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void btn_ReadXML2_Click(object sender, EventArgs e)
 7         {
 8             // 读取文件
 9             XmlTextReader reader = new XmlTextReader(@"C:\Users\zhang-sh\source\repos\repo\repo\folder\XMLFile1.xml"); // System.Environment.CurrentDirectory默认路径bin - debug下
10 
11             while (reader.Read())
12             {
13                 if (reader.Name == "ID") //判断节点名称
14                 {
15                     System.Diagnostics.Debug.WriteLine(reader.ReadString()); // 读取节点内容
16                 }
17                 else if (reader.Name == "Name")
18                 {
19                     System.Diagnostics.Debug.WriteLine(reader.ReadString());
20                 }
21                 else if (reader.Name == "Sex")
22                 {
23                     System.Diagnostics.Debug.WriteLine(reader.ReadString());
24                 }
25                 else if (reader.Name == "Age")
26                 {
27                     System.Diagnostics.Debug.WriteLine(reader.ReadString());
28                 }
29             }
30             reader.Close();  //关闭文档流
31         }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.

View Code

3.2XmlTextWriter

  XmlTextWriter写文件的时候,默认是覆盖以前的文件,如果此文件名不存在,它将创建此文件.首先设置一下,你要创建的XML文件格式。

1: XmlTextWriter myXmlTextWriter =   new XmlTextWriter(  @"..\..\Book1.xml" ,   null );
      2:   //使用 Formatting 属性指定希望将 XML 设定为何种格式。 这样,子元素就可以通过使用 Indentation 和 IndentChar 属性来缩进。
      3: myXmlTextWriter.Formatting = Formatting.Indented;
  • 1.
  • 2.
  • 3.

三,C#-XML序列化Helper:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace WebServiceTest
{
    public class XMLSerializerHelper
    {
        /// <summary>
        /// 序列化对象
        /// </summary>
        /// <param name="t">对象类型</param>
        /// <returns></returns>
        public static string Serialize<T>(T t)
        {
            using (StringWriter sw = new StringWriter())
            {
                XmlSerializer xz = new XmlSerializer(typeof(T));
                xz.Serialize(sw, t);
                return sw.ToString();
            }
        }

        /// <summary>
        /// 反序列化为对象
        /// </summary>
        /// <param name="s">对象序列化后的Xml字符串</param>
        /// <returns></returns>
        public static T Deserialize<T>(string s) where T : class
        {
            using (StringReader sr = new StringReader(s))
            {
                XmlSerializer xz = new XmlSerializer(typeof(T));
                return xz.Deserialize(sr) as T;
            }
        }
    }

    #region 使用示例
    //序列化
    //Product product = new Product() { ProductID = 1, DisCount = 5 };
    //string s = UserQuery.SimpleSerializer.Serialize(product);
    //Console.WriteLine(s);

    反序列化
    //product = UserQuery.SimpleSerializer.Deserialize(typeof(UserQuery.Product), s);
    //Console.WriteLine(product.ProductID.ToString() + ", " + product.DisCount); //1, 5
    #endregion 使用示例
    #region 示例类
    /// <summary>
    /// 测试类
    /// </summary>
    [XmlRoot]
    public class Inventory
    {
        public Inventory() { }
        [XmlArray("allpro")]
        [XmlArrayItem("book", typeof(Book)),
         XmlArrayItem("prod", typeof(Product))]
        public Product[] InventroyItems { set; get; } = new Product[] { new Product(), new Product(), new Product() };  // 数组
    }

    public class Book : Product
    {
        public string ISBN { get; set; } = "测试ISBN";
    }

    /// <summary>
    /// 自定义节点名
    /// </summary>
    [Serializable]
    [XmlRoot("ProductLLL")]
    public class Product
    {
        [XmlAttribute("DiscountTitle")]
        public int DisCount { set; get; }

        public string ProductID { set; get; } = "ID123";  // 默认为[XmlElement("ProductID")] 
    }
    #endregion 示例类
}
/* 结果:
<?xml version="1.0" encoding="utf-16"?>
<Inventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <allpro>
    <prod DiscountTitle="0">
      <ProductID>ID123</ProductID>
    </prod>
    <prod DiscountTitle="0">
      <ProductID>ID123</ProductID>
    </prod>
    <prod DiscountTitle="0">
      <ProductID>ID123</ProductID>
    </prod>
  </allpro>
</Inventory>*/
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.

 详细见:C#三种常用的读取XML文件的方法

作者:꧁执笔小白꧂