C#操作Xml读写

时间:2021-06-16 05:43:30

Xml语法

参考:w3school介绍

xml中Node和Element的区别

XmlReader

XmlReader读取顺序

本部分参考:C#操作Xml:使用XmlReader读Xml

C#操作Xml读写

从图中可以看到XmlReader在读取这段Xml时:
第1次Read()读取的是Xml文档声明部分
第2次Read()读取的是声明后的空白
第3次Read()读取的是根节点root的开始标签
第4次Read()读取的是根节点开始后的空白
第5次Read()读取的是cat节点的开始部分,从左尖括号到右尖括号包括该节点的属性
第6次读取的是cat节点的内容
第7次读取的是cat节点的结束标签
第8次读取的是cat节点结束标签后的空白
第9次读取的是dog节点的开始部分,注意是从左尖括号开始到结束斜杠之前
第10次读取的是dog标签的结束/>
第11次读取的是dog标签结束后的空白
第12次读取的是root的结束标签

XmlReader读取代码

此种方式优点是可以一次读出所有节点及其子节点。

 1         static void XmlReaderTest()
 2         {
 3             XmlReader xmlReader=new XmlTextReader("xml.xml");
 4 
 5             //only get following content:
 6             //xml declaraion:in value
 7             //xml element:in name
 8             //xml text:in value
 9             //xml EndElement:in name
10             //xml whitespace:in value and value is "\r\n"
11             while (xmlReader.Read())//Read() function return false when it reads the end of xml document.
12             {
13 
14                 //Console.WriteLine($"Type:{xmlReader.NodeType}," +
15                 //                  $"Name:{xmlReader.Name}," +
16                 //                  $"Value:{xmlReader.Value}");
17 
18                 if (xmlReader.NodeType == XmlNodeType.XmlDeclaration)
19                 {
20                     Console.WriteLine($"XmlDeclaration:{xmlReader.Value}");
21                 }
22                 else if (xmlReader.NodeType == XmlNodeType.Element)
23                 {
24                     Console.WriteLine($"Element:{xmlReader.Name}");
25 
26                     if (xmlReader.HasAttributes)//get arrtibute of a node
27                     {
28                         Console.WriteLine($"attribute(s) of Element[{xmlReader.Name}] as following:");
29 
30                         while (xmlReader.MoveToNextAttribute())
31                         {
32                             //Name:attribute name  Value:the text of attribute
33                             Console.WriteLine($"{xmlReader.Name},{xmlReader.Value}");
34                         }
35 
36                         Console.WriteLine(xmlReader["Attribute0"]);//get value of arrtibute directly from arrtibute name
37                     }
38                    
39                 }
40                 else if (xmlReader.NodeType == XmlNodeType.EndElement)
41                 {
42                     Console.WriteLine($"EndElement:{xmlReader.Name}");
43                 }
44                 else if (xmlReader.NodeType == XmlNodeType.Text)
45                 {
46                     Console.WriteLine($"Text:{xmlReader.Value}");
47                 }
48             }
49 
50             xmlReader.Close();
51         }

XmlDocument

XmlDocument读取

XmlDocument本身是从XmlNode继承的,读Xml节点可以通过FirstChild,LastChild,或者NextSibling,PreviousSibling读取单个节点,或者通过ChildNodes读取所有子节点。还可以使用XPath表达式使用SelectNodes(string xpath)或者SelectSingleNode(string xpath)读取单个或者多个符合条件的节点。

注意:

  1. InnerText获取该节点及子节点的文本串联值
  2. 获取节点的子节点需添加判断

代码示例:

 1         static void XmlDocumentReadTest()
 2         {
 3             XmlDocument xmlDoc = new XmlDocument();
 4             xmlDoc.Load("xml.xml");
 5 
 6             XmlNode rootNode = xmlDoc.FirstChild;//get xml declaration
 7             Console.WriteLine($"xml declaration:{rootNode.Value}");
 8 
 9             //get root element
10             XmlElement xmlRootElement = xmlDoc.DocumentElement;
11             Console.WriteLine($"xmlRootElement Name:{xmlRootElement?.Name}," +
12                               $"NodeType:{xmlRootElement?.NodeType}," +
13                               $"Value:{xmlRootElement?.Value}");
14 
15             if (xmlRootElement?.HasChildNodes == true)
16             {
17                 foreach (XmlNode node in xmlRootElement.ChildNodes)
18                 {
19                     Console.WriteLine($"node name:{node.Name}," +
20                                       $"node value:{node.Value}," +
21                                       $"node inner text:{node.InnerText}");  
22                 }
23 
24                 Console.WriteLine("---read finished---");
25             }
26 
27             //get specific element value           
28             XmlNodeList nodeList = xmlDoc.SelectNodes("/RootZero/MixNode/ChildNodeOfMixNode");
29             if (nodeList!=null&&nodeList.Count!=0)
30             {
31                 foreach (XmlNode node in nodeList)
32                 {
33                     Console.WriteLine($"Name:{node.Name}," +
34                                       $"Value:{node.Value}," +
35                                       $"InnerText:{node.InnerText}");
36 
37                     if (node.Attributes.Count != 0)
38                     {
39                         Console.WriteLine($"arrtibute(s) of Node[{node.Name}] as following");
40                         foreach (XmlAttribute attribute in node.Attributes)
41                         {
42                             Console.WriteLine($"Name:{attribute.Name}," +
43                                               $"Value:{attribute.Value}," +
44                                               $"InnetText:{attribute.InnerText}");
45 
46                             Console.WriteLine($"attribute(s) of Node[{node.Name}] finished");
47                         }
48                     }
49                 }
50 
51               
52             }
53             
54 
55         }

XmlDocument写操作

参考:通过XmlDocument读写Xml文档

XmlDocument修改/写Xml文档

XmlDocument对文档添加新节点和属性等操作

XmlDocument修改Xml文档

以下展示了对RootZero/MixNode/ChildNodeOfMixNode子节点修改、添加子节点和属性的操作。

 1         static void XmlDocumentModifyTest()
 2  { 3 XmlDocument xmlDoc = new XmlDocument(); 4 xmlDoc.Load("xml.xml"); 5 6 //modify specific node text and attribute 7 XmlNodeList nodeList = xmlDoc.SelectNodes("/RootZero/MixNode/ChildNodeOfMixNode"); 8 9 10 nodeList[0].InnerText = "modifyed inner text"; 11 nodeList[0].Attributes[0].Value = "modifyed attribute"; 12 //add new attribute to a existed node 13 XmlAttribute newAttribute = xmlDoc.CreateAttribute("NewAttributeForExistedNode"); 14 newAttribute.InnerText = "XXX"; 15 nodeList[0].Attributes.Append(newAttribute); 16 17 //add new element to a existed element 18 XmlElement newElement = xmlDoc.CreateElement("NewElement"); 19 newElement.SetAttribute("NewAttribute0", "000");//add attribute to new element. 20 newElement.SetAttribute("NewAttribute1", "111"); 21 newElement.InnerText = "new element innerText"; 22 XmlNode xmlNode = nodeList[0].PrependChild(newElement); 23 24 xmlDoc.Save("modifyed.xml");//existed xml file will be overwrited. 25 }

XmlDocument新建Xml文档

创建文档,先指定xml声明,添加新节点,如下:

1             XmlDocument xmlDoc = new XmlDocument();
2 
3             XmlNode declaraedNode = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null); 4  xmlDoc.AppendChild(declaraedNode); 5 //add root node 6 XmlNode rootNode = xmlDoc.CreateElement("Root"); 7 xmlDoc.AppendChild(rootNode);

 

余下操作与修改类似,以XmlNode和XmlElement两种方式均可

XDocument

MDDN官方文档:XDocument

一个比较全面的示例:XDocument简单入门