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简单入门