1、c#对XML文件的解析

1、XML文件

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <PersonF xmlns="" Name="(test)work hard work smart!">
 3   <person Name="Person1">
 4     <ID>1</ID>
 5     <Name>XiaoA</Name>
 6     <Age>59</Age>
 7   </person>
 8   <person Name="Person2">
 9     <ID>2</ID>
10     <Name>XiaoB</Name>
11     <Age>29</Age>
12   </person>
13   <person Name="Person3">
14     <ID>3</ID>
15     <Name>XiaoC</Name>
16     <Age>103</Age>
17   </person>
18   <person Name="Person4">
19     <ID>4</ID>
20     <Name>XiaoD</Name>
21     <Age>59</Age>
22   </person>
23 </PersonF>

2、程序代码

 1        string path = @"E:测试XML读取XML.xml";
 2             XmlDocument xd = new XmlDocument();
 3             try
 4             {
 5                 xd.Load(path);
 6                 switch (count)
 7                 {
 8                     case 0:
 9                         //1、读取单个节点的数据
10                         XmlNode xn1= xd.SelectSingleNode("PersonF");
11                         richTextBox1.Text = xn1.InnerText.ToString();
12                         count++;break;
13                     case 1:
14                         //2、读取多个节点的数据
15                         XmlNodeList xn2 = xd.SelectNodes("PersonF/person");
16                         foreach (XmlNode xn in xn2)
17                         {
18                             richTextBox1.Text += xn.InnerText;
19                         }
20                         count++;break;
21                     case 2:
22                         //3.1、读取具体节点的具体值 如:Name属性为Person2的Name的InnerText
23                         XmlNodeList xn3 = xd.DocumentElement.GetElementsByTagName("person");
24                         foreach (XmlNode xn in xn3)
25                         {
26                             if (xn.Attributes["Name"].InnerText == "Person2")
27                             {
28                                 richTextBox1.Text += xn.InnerText;
29                             }
30                         }
31                         count++; break;
32                     case 3:
33                         //3.2、读取ID为2所在的节点第二个子节点Name的InnerText
34                         XmlNode xn4 = xd.SelectSingleNode("PersonF/person[ID=2]");
35                         richTextBox1.Text = xn4.ChildNodes[1].InnerText;
36                         count++; break;
37                     case 4:
38                         //3.3、找到ID为2的节点的父节点Name属性
39                         XmlNodeList xn5 = xd.SelectNodes("//person//ID");//读取ID为2的节点
40                         foreach (XmlNode xn in xn5)
41                         {
42                             if (xn.InnerText == "2")
43                             {
44                                 richTextBox1.Text += xn.ParentNode.Attributes["Name"].InnerText;
45                             }
46                         }
47                         count++;break;
48                     case 5:
49                         //4、修改节点属性
50                         XmlNode xn6 = xd.SelectSingleNode("PersonF");
51                         xn6.Attributes["Name"].InnerText = "helloworld";
52                         xd.Save(path);
53                         count++; break;
54                     case 6:
55                         //5、添加自定义节点
56                         XmlTextReader xr = new XmlTextReader(path);
57                         XmlElement root = xd.DocumentElement;//根节点(最外层节点)
58 
59                         XmlElement newele = xd.CreateElement("person");//第二层节点
60                         newele.SetAttribute("Name", "Person6");
61 
62                         XmlElement ele_id = xd.CreateElement("ID");//newele子节点
63                         ele_id.InnerText = "5";
64                         XmlElement ele_name = xd.CreateElement("Name");//newele子节点
65                         ele_name.InnerText = "XiaoE";
66                         newele.AppendChild(ele_id);
67                         newele.AppendChild(ele_name);
68                         root.AppendChild(newele);
69 
70                         xr.Close();
71                         xd.Save(path);
72 
73                         count=0; break;
74                 }
75 
76             }
77             catch 
78             {
79                 Exception ex;
80             }

 源码下载:http://pan.baidu.com/s/1dDRzZ4P

3.XPath详解

 1)"/bookstore/book/price"

XPath的开头是一个斜线(/)代表这是绝对路径,这可以选出所有路径符合这个模式的元素。这代表选出所有bookstore根节点下的book元素下的price元素。

2)"//title"

开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。这代表选出所有title元素。

3)"/bookstore/book/author/*"

使用星号(*)可以选择未知的元素。这代表选出bookstore根节点下的book节点下的anthor节点下的所有可能的节点。

得到的结果:25 25 female

4)"/bookstore/book/*/age"

上面的语法会选出所有bookstore根节点下的book节点的隔一个层次的age节点。

得到的结果为:25 25

5)"/*/*/age"

选取有两个层级的age元素,得到的结果为:100

要注意的是,想要存取不分层级的元素,XPath语法必须以两个斜线开头(//),想要存取未知元素才用星号(*),星号只能代表未知名称的元素,不能代表未知层级的元素。

6)"bookstore/book[1]/title"

 使用中括号可以选择分支。这代表选择bookstore根节点下第一个book节点的title节点。

得到的结果为:C语言

7)"bookstore/book[last()]/title"

 同样,这里表示选择最后一个节点,得到的结果是:数据结构

8)"bookstore/book/author[sex]"

这里表示选取所有带有sex元素并满足一定层次结构的author节点,得到的结果是:25female

9)"/bookstore/book[price=66.5]/title"

 选取price元素值是66.5的book节点的title子节点,得到的结果是:数据结构

10)"/bookstore/book/title | /bookstore/book/price"

 使用Or操作数(|)就可以选择一个以上的路径。这里表示选取符合一定层次结构的title元素与price元素

其结果是:C语言 50 数据库 100 数据结构 66.5

 11)"//@name"

XPath中,除了选择元素以外,也可以选择属性,属性都是以@开头。这里表示选取所有的name属性。

其结果是:XIAO Wang

 12)"//author[@name]/age"

这里表示选取所有具有name属性的author节点的age节点。其结果是:25 25

13)"//*[@*]"

选取所有有属性的节点。其结果是:25 25female

14)"//author[@name='Wang']/sex"

选取所有属性name值为Wang的author节点的sex子节点。其结果是:female

小结:
1. 读写整个XML最方便的方法是使用序列化反序列化。
2. 如果您希望某个参数以Xml Property的形式出现,那么需要使用[XmlAttribute]修饰它。
3. 如果您希望某个参数以Xml Element的形式出现,那么需要使用[XmlElement]修饰它。
4. 如果您希望为某个List的项目指定ElementName,则需要[XmlArrayItem]
5. 以上3个Attribute都可以指定在XML中的映射别名。
6. 写XML的操作是通过XmlSerializer.Serialize()来实现的。
7. 读取XML文件是通过XmlSerializer.Deserialize来实现的。
8. List或Array项,请不要使用[XmlElement],否则它们将以内联的形式提升到当前类,除非你再定义一个容器类。

原文地址:https://www.cnblogs.com/wleaves/p/5085467.html