文档解析之XML文档读取

一、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
<?xml version="1.0" encoding="utf-8"?>
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
<?xml version="1.0" encoding="utf-8"?>
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
<?xml version="1.0" encoding="utf-8"?>
2
<Order>
3
  <CustomerName>
4
    <p>这是一个标签</p>
5
  </CustomerName>
6
  <CustomerNumber>&lt;p&gt;这是一个标签&lt;/p&gt;</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
<?xml version="1.0" encoding="utf-8"?>
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
<?xml version="1.0" encoding="utf-8"?>
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
<?xml version="1.0" encoding="utf-8"?>
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
<?xml version="1.0" encoding="utf-8"?>
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
<?xml version="1.0" encoding="utf-8"?>
2
<Order>
3
  <CustomerName>郭超林</CustomerName>
4
  <CustomerNumber>1000067897</CustomerNumber>
5
  <Item>
6
  </Item>
7
</Order>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值