Xml語法
參考:w3school介紹
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)讀取單個或者多個符合條件的節點。
注意:
- InnerText獲取該節點及子節點的文本串聯值
- 獲取節點的子節點需添加判斷
代碼示例:
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文檔
以下展示了對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簡單入門