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],否则它们将以内联的形式提升到当前类,除非你再定义一个容器类。