一、XML简介
概念:XML指可扩展标记语言
XML被设计用来传输和存储数据,XML被设计用来结构化、存储以及传输信息
XML文档必须包含根元素,该元素是所有其他元素的父元素
XML文档中的元素形成一颗文档树,这棵树从根部开始,并扩展到树的最底端
二、XML语法规则
所有的XML元素都必须有关闭标签
<p>This is a paragaph<p>
XML标签对大小写敏感,标签<Letter>与标签<letter>
<Message>这是错误的</message>
<message>这是正确的</message>
XML必须正确的嵌套
<b><i>This text is bold and italic</b></i>
<b><i>This text is bold and italic</i></b>
XML文档必须有根元素
<root>
<child>
<subchild>....<subchild>
<child>
<root>
XML的属性必须加引号
<note date=08/08/2008>
<to>George</to>
<from>John</from>
XML元素必须遵循一下命名规则:
1、名称可以含字母、数字以及其他字符
2、名称不能以数字或者标点符号开始
3、名称不能以字符"xml"(或者XML、Xml)开始
4、名称不能包含空格
三、XML文档的创建
1、普通xml文档的创建
1
static void Main(string[] args)
2
{
3
//通过代码创建xml文本
4
//1、引入命名空间
5
//2、创建xml文本对象
6
XmlDocument doc=new XmlDocument();
7
//3、创建第一行描述信息,并添加到doc文本中
8
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
9
doc.AppendChild(dec);
10
11
//4、创建根节点,并添加到文档中
12
XmlElement books = doc.CreateElement("Books");
13
doc.AppendChild(books);
14
15
//5、给根节点books创建子节点
16
XmlElement book = doc.CreateElement("Book");
17
//添加到books节点中
18
books.AppendChild(book);
19
20
//6、给book节点添加子节点
21
//添加名称节点
22
XmlElement name1 = doc.CreateElement("Name");
23
name1.InnerText = "金瓶梅";
24
book.AppendChild(name1);
25
//添加价格节点
26
XmlElement price1= doc.CreateElement("Price");
27
price1.InnerText="10";
28
book.AppendChild(price1);
29
//添加描述节点
30
XmlElement doc1 = doc.CreateElement("Doc");
31
doc1.InnerText = "特别好看,很黄很暴力";
32
book.AppendChild(doc1);
33
34
//创建新的book节点
35
XmlElement book2 = doc.CreateElement("Book");
36
//将节点添加到根节点中
37
books.AppendChild(book2);
38
39
XmlElement name2 = doc.CreateElement("Name");
40
name2.InnerText = "三国演义";
41
book2.AppendChild(name2);
42
43
XmlElement price2 = doc.CreateElement("Price");
44
price2.InnerText = "20";
45
book2.AppendChild(price2);
46
47
XmlElement doc2 = doc.CreateElement("Doc");
48
doc2.InnerText = "一般般啦";
49
book2.AppendChild(doc2);
50
51
//存储
52
doc.Save("Books.xml");
53
Console.WriteLine("保存成功");
54
Console.ReadKey();
55
}
1
2
<Books>
3
<Book>
4
<Name>金瓶梅</Name>
5
<Price>10</Price>
6
<Doc>特别好看,很黄很暴力</Doc>
7
</Book>
8
<Book>
9
<Name>三国演义</Name>
10
<Price>20</Price>
11
<Doc>一般般啦</Doc>
12
</Book>
13
</Books>
2、带属性的XML文档的创建
1
static void Main(string[] args)
2
{
3
XmlDocument doc=new XmlDocument();
4
//添加第一行信息
5
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
6
doc.AppendChild(dec);
7
//添加根节点
8
XmlElement order = doc.CreateElement("Order");
9
doc.AppendChild(order);
10
XmlElement customerName = doc.CreateElement("CustomerName");
11
customerName.InnerText = "郭超林";
12
order.AppendChild(customerName);
13
XmlElement customerNumber = doc.CreateElement("CustomerNumber");
14
customerNumber.InnerText = "10089";
15
order.AppendChild(customerNumber);
16
17
XmlElement item = doc.CreateElement("Item");
18
19
order.AppendChild(item);
20
21
XmlElement orderItem1 = doc.CreateElement("OrderItem");
22
//给节点添加属性
23
orderItem1.SetAttribute("Name", "码表");
24
orderItem1.SetAttribute("Count", "100");
25
item.AppendChild(orderItem1);
26
27
XmlElement orderItem2 = doc.CreateElement("OrderItem");
28
//给节点添加属性
29
orderItem2.SetAttribute("Name", "气球");
30
orderItem2.SetAttribute("Count", "3");
31
item.AppendChild(orderItem2);
32
33
XmlElement orderItem3 = doc.CreateElement("OrderItem");
34
//给节点添加属性
35
orderItem3.SetAttribute("Name", "家具");
36
orderItem3.SetAttribute("Count", "56");
37
item.AppendChild(orderItem3);
38
39
40
doc.Save("Order.xml");
41
Console.WriteLine("保存成功");
42
Console.ReadKey();
43
}
效果如下
1
2
<Order>
3
<CustomerName>郭超林</CustomerName>
4
<CustomerNumber>1000067897</CustomerNumber>
5
<Item>
6
<OrderItem Name="码表" Count="100" />
7
<OrderItem Name="气球" Count="3" />
8
<OrderItem Name="家具" Count="56" />
9
</Item>
10
</Order>
InnerXml和InnerText之前的区别
1
XmlElement customerName = doc.CreateElement("CustomerName");
2
customerName.InnerXml = "<p>这是一个标签</p>";
3
order.AppendChild(customerName);
4
XmlElement customerNumber = doc.CreateElement("CustomerNumber");
5
customerNumber.InnerText = "<p>这是一个标签</p>";
6
order.AppendChild(customerNumber);
1
2
<Order>
3
<CustomerName>
4
<p>这是一个标签</p>
5
</CustomerName>
6
<CustomerNumber><p>这是一个标签</p></CustomerNumber>
7
<Item>
8
<OrderItem Name="码表" Count="100" />
9
<OrderItem Name="气球" Count="3" />
10
<OrderItem Name="家具" Count="56" />
11
</Item>
12
</Order>
结论:当我们需要往文档中添加标签时,使用InnerXml,当我们需要往文档中添加文本时,使用InnerText
四、Xml中数据的追加
追加前:
1
2
<Books>
3
<Book>
4
<Name>金瓶梅</Name>
5
<Price>10</Price>
6
<Doc>特别好看,很黄很暴力</Doc>
7
</Book>
8
<Book>
9
<Name>三国演义</Name>
10
<Price>20</Price>
11
<Doc>一般般啦</Doc>
12
</Book>
13
</Books>
追加后:
1
2
<Books>
3
<Book>
4
<Name>金瓶梅</Name>
5
<Price>10</Price>
6
<Doc>特别好看,很黄很暴力</Doc>
7
</Book>
8
<Book>
9
<Name>三国演义</Name>
10
<Price>20</Price>
11
<Doc>一般般啦</Doc>
12
</Book>
13
<Book>
14
<Name>聊斋志异</Name>
15
<Price>67</Price>
16
<Doc>神怪小说</Doc>
17
</Book>
18
</Books>
追加代码:
1
static void Main(string[] args)
2
{
3
XmlDocument doc = new XmlDocument();
4
XmlElement books;
5
if (File.Exists("Books.xml"))
6
{
7
//如果存在 加载xml
8
doc.Load("Books.xml");
9
//获取文本的根节点
10
books = doc.DocumentElement;
11
12
}
13
else
14
{
15
//如果不存在
16
//创建第一行信息栏
17
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
18
doc.AppendChild(dec);
19
//创建根节点
20
books = doc.CreateElement("Books");
21
doc.AppendChild(books);
22
23
}
24
//5、给根节点books创建子节点
25
XmlElement book = doc.CreateElement("Book");
26
//添加到books节点中
27
books.AppendChild(book);
28
29
//给book节点添加子节点
30
//添加名称节点
31
XmlElement name1 = doc.CreateElement("Name");
32
name1.InnerText = "聊斋志异";
33
book.AppendChild(name1);
34
//添加价格节点
35
XmlElement price1 = doc.CreateElement("Price");
36
price1.InnerText = "67";
37
book.AppendChild(price1);
38
//添加描述节点
39
XmlElement doc1 = doc.CreateElement("Doc");
40
doc1.InnerText = "神怪小说";
41
book.AppendChild(doc1);
42
//存储
43
doc.Save("Books.xml");
44
Console.WriteLine("保存成功");
45
Console.ReadKey();
46
}
五、XML文档的读取
1、普通XML文档的读取
1
XmlDocument doc=new XmlDocument();
2
//加载要读取的文本
3
doc.Load("Books.xml");
4
//获得根节点
5
XmlElement books = doc.DocumentElement;
6
//获得子节点,返回节点的集合
7
XmlNodeList xnl = books.ChildNodes;
8
9
foreach (XmlNode item in xnl)
10
{
11
Console.WriteLine(item.InnerText);
12
}
XML文档如下:
1
2
<Books>
3
<Book>
4
<Name>金瓶梅</Name>
5
<Price>10</Price>
6
<Doc>特别好看,很黄很暴力</Doc>
7
</Book>
8
<Book>
9
<Name>三国演义</Name>
10
<Price>20</Price>
11
<Doc>一般般啦</Doc>
12
</Book>
13
<Book>
14
<Name>聊斋志异</Name>
15
<Price>67</Price>
16
<Doc>神怪小说</Doc>
17
</Book>
18
</Books>
2、带有属性的XML文档的读取
1
XmlDocument doc=new XmlDocument();
2
doc.Load("Order.xml");
3
XmlNodeList xnl = doc.SelectNodes("Order/Item/OrderItem");
4
foreach (XmlNode item in xnl)
5
{
6
Console.WriteLine(item.Attributes["Name"].Value);
7
Console.WriteLine(item.Attributes["Count"].Value);
8
}
XML文档如下:
1
2
<Order>
3
<CustomerName>郭超林</CustomerName>
4
<CustomerNumber>1000067897</CustomerNumber>
5
<Item>
6
<OrderItem Name="码表" Count="100" />
7
<OrderItem Name="气球" Count="3" />
8
<OrderItem Name="家具" Count="56" />
9
</Item>
10
</Order>
3、普通xml和带有属性的XML一起读取(强烈推荐使用这种方式)
XML文档如下所示:
1
<skills>//开始节点
2
<skill>
3
<id>2</id>
4
<name lang="cn">天下无双</name>
5
<damage>100</damage>
6
</skill>
7
<skill>
8
<id>3</id>
9
<name lang="cn">小二黑</name>
10
<damage>236</damage>
11
</skill>
12
<skill>
13
<id>4</id>
14
<name lang="cn">光头强</name>
15
<damage>456</damage>
16
</skill>
17
</skills>//结束节点
代码如下:
1、首先创建一个Skll类,用来存储文档中的节点名称
1
class Skill
2
{
3
public int ID { get; set; }
4
public string Name { get; set; }
5
public string Lang { get; set; }
6
public int Damage { get; set; }
7
public override string ToString()
8
{
9
return $"ID: {ID}, Name: {Name}, Lang: {Lang}, Damage: {Damage}";
10
}
11
12
}
2、在主函数中读取XML文档
1
using System;
2
using System.Collections.Generic;
3
using System.IO;
4
using System.Linq;
5
using System.Text;
6
using System.Threading.Tasks;
7
using System.Xml;
8
9
namespace XML3
10
{
11
class Program
12
{
13
static void Main(string[] args)
14
{
15
//创建技能信息集合,用来存储所有的技能信息
16
List<Skill> skillList = new List<Skill>();
17
XmlDocument xmlDoc = new XmlDocument();
18
//xmlDoc.Load("TextFile1.txt");//选择要加载解析的XML文档
19
xmlDoc.LoadXml(File.ReadAllText("技能.xml"));//传递一个xml格式的字符串
20
//得到根节点
21
XmlNode rootNode = xmlDoc.FirstChild;//获取第一个节点
22
//得到根节点下面的子节点的集合
23
XmlNodeList skillNoteList = rootNode.ChildNodes;//获取获取当前节点下面的所有子节点
24
//遍历所有节点
25
foreach (XmlNode skillNote in skillNoteList)
26
{
27
Skill skill = new Skill();//创建一个技能类对象
28
XmlNodeList filedNoteList = skillNote.ChildNodes;//获取Skill节点下面的所有节点
29
foreach (XmlNode fieldNode in filedNoteList)
30
{
31
if (fieldNode.Name == "id")//通过Name获取一个节点的名字
32
{
33
int id = Int32.Parse(fieldNode.InnerText); //获取节点内部的文本
34
skill.ID = id;//把字符串赋值给文本
35
}
36
else if (fieldNode.Name == "name")
37
{
38
string name = fieldNode.InnerText;//获取节点内部的文本
39
skill.Name = name;
40
skill.Lang = fieldNode.Attributes[0].Value;//将文本中的属性赋值给类中的属性
41
}
42
else
43
{
44
skill.Damage = Int32.Parse(fieldNode.InnerText);
45
}
46
}
47
skillList.Add(skill);//将技能信息加到集合中
48
}
49
foreach (Skill skill in skillList)//遍历输出所有技能信息
50
{
51
Console.WriteLine("--------获取所有信息--------");
52
Console.WriteLine(skill);//获取所有信息
53
Console.WriteLine("---获取ID信息---");
54
Console.WriteLine(skill.ID);//获取ID信息
55
Console.WriteLine("---获取伤害信息---");
56
Console.WriteLine(skill.Damage);//获取伤害信息
57
Console.WriteLine("---获取名称信息---");//获取伤害信息
58
Console.WriteLine(skill.Name);//获取伤害信息
59
}
60
Console.ReadKey();
61
}
62
}
63
}
效果如下:
六、XML文档数据的删除
1
XmlDocument doc = new XmlDocument();
2
doc.Load("Order.xml");
3
4
XmlNode xn = doc.SelectSingleNode("/Order/Item");
5
xn.RemoveAll();
6
doc.Save("Order.xml");
执行程序后的XML文档如下
1
2
<Order>
3
<CustomerName>郭超林</CustomerName>
4
<CustomerNumber>1000067897</CustomerNumber>
5
<Item>
6
</Item>
7
</Order>