C#操作Xml讀寫


Xml語法

參考:w3school介紹

xml中Node和Element的區別

XmlReader

XmlReader讀取順序

本部分參考:C#操作Xml:使用XmlReader讀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簡單入門

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM