首页 > 代码库 > .Net那点事儿系列:C#操作Xml:通过XmlDocument读写Xml文档

.Net那点事儿系列:C#操作Xml:通过XmlDocument读写Xml文档

什么是Xml?

Xml是扩展标记语言的简写,是一种开发的文本格式。关于它的更多情况可以通过w3组织了解http://www.w3.org/TR/1998/REC-xml-19980210。如果你不知道它,那你就out太多了。

.Net处理Xml相关随笔

1.通过XmlDocument读写Xml文档
2.通过XmlWriter和XmlReader读写Xml文档
3.通过LINK to Xml存取XML
4.通过XmlScheme定义固定格式xml文档
5.Xml序列化或者反序列化类
6.通过XPath查找Xml节点
7.通过Xslt转化Xml格式

有如下一段Xml:

[html] view plaincopy
 
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <students>  
  3.   <!--我是一段注释文字-->  
  4.   <student name="张平">  
  5.     <courses>  
  6.       <course name="语文?">  
  7.         <teacherComment>  
  8.           <![CDATA[ 
  9.         这里是语文老师的批注 
  10.         ]]>  
  11.         </teacherComment>        
  12.     </course>  
  13.   
  14.       <course name="数学">  
  15.         <teacherComment>  
  16.           <![CDATA[ 
  17.         这里是数学老师的批注 
  18.         ]]>  
  19.         </teacherComment>  
  20.       </course>  
  21.     </courses>  
  22.   </student>  
  23. </students>  


1.如何使用XmlDocument读取Xml
我要用一段代码遍历所有Student,并打印Student的所有属性和子节点的值

 

[csharp] view plaincopy
 
  1. /*玉开博客 http://blog.csdn.net/yukaizhao/ */  
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Text;  
  5. using System.Xml;  
  6.   
  7. namespace XmlExample  
  8. {  
  9.     class Program  
  10.     {  
  11.         static void Main(string[] args)  
  12.         {  
  13.             string xmlFilePath = @"X:\about.net\example\XmlExample\1.xml";  
  14.             XmlDocument doc = new XmlDocument();  
  15.             doc.Load(xmlFilePath);  
  16.   
  17.             //使用xpath表达式选择文档中所有的student子节点  
  18.             XmlNodeList studentNodeList = doc.SelectNodes("/students/student");  
  19.             if (studentNodeList != null)  
  20.             {  
  21.                 foreach (XmlNode studentNode in studentNodeList)  
  22.                 {  
  23.                     //通过Attributes获得属性名字为name的属性  
  24.                     string name = studentNode.Attributes["name"].Value;  
  25.                     Console.WriteLine("Student:" + name);  
  26.   
  27.                     //通过SelectSingleNode方法获得当前节点下的courses子节点  
  28.                     XmlNode coursesNode = studentNode.SelectSingleNode("courses");  
  29.   
  30.                     //通过ChildNodes属性获得courseNode的所有一级子节点  
  31.                     XmlNodeList courseNodeList = coursesNode.ChildNodes;  
  32.                     if (courseNodeList != null)  
  33.                     {  
  34.                         foreach (XmlNode courseNode in courseNodeList)  
  35.                         {  
  36.                             Console.Write("\t");  
  37.                             Console.Write(courseNode.Attributes["name"].Value);  
  38.                             Console.Write("老师评语");  
  39.                             //通过FirstNode属性可以获得课程节点的第一个子节点,LastNode可以获得最后一个子节点  
  40.                             XmlNode teacherCommentNode = courseNode.FirstChild;  
  41.                             //读取CData节点  
  42.                             XmlCDataSection cdata = (XmlCDataSection)teacherCommentNode.FirstChild;  
  43.                             Console.WriteLine(cdata.InnerText.Trim());  
  44.                         }  
  45.                     }  
  46.                 }  
  47.             }  
  48.   
  49.             Console.Write("\r\nPress any key to continue....");  
  50.             Console.Read();  
  51.         }  
  52.     }  
  53. }  


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


2.如何通过XmlDocument编辑Xml

同样是读取Xml中的xml例子,我们这次要用csharp代码生成xml,如下代码:

[csharp] view plaincopy
 
  1. /*玉开博客 http://blog.csdn.net/yukaizhao/ */  
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Text;  
  5. using System.Xml;  
  6.   
  7. namespace WriteXml  
  8. {  
  9.     class Program  
  10.     {  
  11.         static void Main(string[] args)  
  12.         {  
  13.             XmlDocument xmlDoc = new XmlDocument();  
  14.             //创建Xml声明部分,即<?xml version="1.0" encoding="utf-8" ?>  
  15.             xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "yes");  
  16.   
  17.             //创建根节点  
  18.             XmlNode rootNode = xmlDoc.CreateElement("students");  
  19.   
  20.             //创建student子节点  
  21.             XmlNode studentNode = xmlDoc.CreateElement("student");  
  22.             //创建一个属性  
  23.             XmlAttribute nameAttribute = xmlDoc.CreateAttribute("name");  
  24.             nameAttribute .Value = "张同学";  
  25.             //xml节点附件属性  
  26.             studentNode.Attributes.Append(nameAttribute);  
  27.   
  28.              
  29.             //创建courses子节点  
  30.             XmlNode coursesNode = xmlDoc.CreateElement("courses");  
  31.             XmlNode courseNode1 = xmlDoc.CreateElement("course");  
  32.             XmlAttribute courseNameAttr = xmlDoc.CreateAttribute("name");  
  33.             courseNameAttr.Value = "语文";  
  34.             courseNode1.Attributes.Append(courseNameAttr);  
  35.             XmlNode teacherCommentNode = xmlDoc.CreateElement("teacherComment");  
  36.             //创建Cdata块  
  37.             XmlCDataSection cdata = xmlDoc.CreateCDataSection("<font color=\"red\">这是语文老师的批注</font>");  
  38.             teacherCommentNode.AppendChild(cdata);  
  39.             courseNode1.AppendChild(teacherCommentNode);  
  40.             coursesNode.AppendChild(courseNode1);  
  41.             //附加子节点  
  42.             studentNode.AppendChild(coursesNode);  
  43.   
  44.             rootNode.AppendChild(studentNode);  
  45.             //附加根节点  
  46.             xmlDoc.AppendChild(rootNode);  
  47.   
  48.             //保存Xml文档  
  49.             xmlDoc.Save(@"d:\test.xml");  
  50.   
  51.             Console.WriteLine("已保存Xml文档");  
  52.   
  53.   
  54.         }  
  55.     }  
  56. }  


使用XmlDocument生成xml的要点在于使用xmlDocument的实例的CreateElement创建XmlNode或者通过CreateAttribute方法创建属性,并通过AppendChild方法附加xml节点,通过AppendAttribute附加Attribute到节点的属性集合。

C#处理Xml相关随笔

1.通过XmlDocument读写Xml文档
2.通过XmlWriter和XmlReader读写Xml文档
3.通过LINK to Xml存取XML
4.通过XmlScheme定义固定格式xml文档
5.Xml序列化或者反序列化类
6.通过XPath查找Xml节点
7.通过Xslt转化Xml格式

.Net那点事儿系列:C#操作Xml:通过XmlDocument读写Xml文档