1、c#对XML文件的解析
2015-12-29 13:40
507 查看
1、XML文件
2、程序代码
源码下载: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],否则它们将以内联的形式提升到当前类,除非你再定义一个容器类。
<?xml version="1.0" encoding="utf-8"?> <PersonF xmlns="" Name="(test)work hard work smart!"> <person Name="Person1"> <ID>1</ID> <Name>XiaoA</Name> <Age>59</Age> </person> <person Name="Person2"> <ID>2</ID> <Name>XiaoB</Name> <Age>29</Age> </person> <person Name="Person3"> <ID>3</ID> <Name>XiaoC</Name> <Age>103</Age> </person> <person Name="Person4"> <ID>4</ID> <Name>XiaoD</Name> <Age>59</Age> </person> </PersonF>
2、程序代码
string path = @"E:\测试\XML读取\XML.xml"; XmlDocument xd = new XmlDocument(); try { xd.Load(path); switch (count) { case 0: //1、读取单个节点的数据 XmlNode xn1= xd.SelectSingleNode("PersonF"); richTextBox1.Text = xn1.InnerText.ToString(); count++;break; case 1: //2、读取多个节点的数据 XmlNodeList xn2 = xd.SelectNodes("PersonF/person"); foreach (XmlNode xn in xn2) { richTextBox1.Text += xn.InnerText; } count++;break; case 2: //3.1、读取具体节点的具体值 如:Name属性为Person2的Name的InnerText XmlNodeList xn3 = xd.DocumentElement.GetElementsByTagName("person"); foreach (XmlNode xn in xn3) { if (xn.Attributes["Name"].InnerText == "Person2") { richTextBox1.Text += xn.InnerText; } } count++; break; case 3: //3.2、读取ID为2所在的节点第二个子节点Name的InnerText XmlNode xn4 = xd.SelectSingleNode("PersonF/person[ID=2]"); richTextBox1.Text = xn4.ChildNodes[1].InnerText; count++; break; case 4: //3.3、找到ID为2的节点的父节点Name属性 XmlNodeList xn5 = xd.SelectNodes("//person//ID");//读取ID为2的节点 foreach (XmlNode xn in xn5) { if (xn.InnerText == "2") { richTextBox1.Text += xn.ParentNode.Attributes["Name"].InnerText; } } count++;break; case 5: //4、修改节点属性 XmlNode xn6 = xd.SelectSingleNode("PersonF"); xn6.Attributes["Name"].InnerText = "helloworld"; xd.Save(path); count++; break; case 6: //5、添加自定义节点 XmlTextReader xr = new XmlTextReader(path); XmlElement root = xd.DocumentElement;//根节点(最外层节点) XmlElement newele = xd.CreateElement("person");//第二层节点 newele.SetAttribute("Name", "Person6"); XmlElement ele_id = xd.CreateElement("ID");//newele子节点 ele_id.InnerText = "5"; XmlElement ele_name = xd.CreateElement("Name");//newele子节点 ele_name.InnerText = "XiaoE"; newele.AppendChild(ele_id); newele.AppendChild(ele_name); root.AppendChild(newele); xr.Close(); xd.Save(path); count=0; break; } } catch { Exception ex; }
源码下载: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],否则它们将以内联的形式提升到当前类,除非你再定义一个容器类。
相关文章推荐
- 【C#】 之 out和ref
- C# RDLC 绑定
- C# Regex 正则表达式 匹配特定的内容
- C# RGB颜色转换为16进制
- C# 用 * 输出两个等腰三角形组成的菱形
- C# 使用 DirectoryInfo 递归指定目录中的所有目录及文件
- C# 打开指定的文件夹 记住路径中 / 与 \ 的用法
- 带有按钮并且可以执行单击事件的WINFORM窗体,体悟C#的创建过程
- C# 入门之 Hello World
- C#动态编译
- 【机房收费系统C#版】——导出Excel
- c#读取xml配置文件
- C#序列化和反序列化代码总结
- C#中xml序列化和反序列化
- c#中SOAP序列化和反序列化
- C#中委托
- C# 发送邮件 qq与163
- C#通用之文件
- C#调用Exe
- 【C#】标签页