C#操作Xml:通过XmlDocument读写Xml文档

      

C#操作Xml:通过XmlDocument读写Xml文档

.Net那点事儿系列:C#操作Xml
什么是Xml?

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

1. 通过XmlDocument读写Xml文档
2. 使用XmlReader读Xml, 使用XmlWriter写Xml
3. 使用Linq to xml存取XML
4. 通过XmlScheme定义固定格式xml文档
5. Xml序列化或者反序列化类
6. 通过XPath查找Xml节点
7. 通过Xslt转化Xml格式
通过XmlDocument读写Xml文档
有如下一段Xml:
?
<? xml version = "1.0" encoding = "utf-8" ?>
< students >
  <!--我是一段注释文字-->
  < student name = "张平" >
    < courses >
      < course name = "语文?" >
        < teacherComment >
          <![CDATA[
        这里是语文老师的批注
        ]]>
        </ teacherComment >     
    </ course >
      < course name = "数学" >
        < teacherComment >
          <![CDATA[
        这里是数学老师的批注
        ]]>
        </ teacherComment >
      </ course >
    </ courses >
  </ student >
</ students >
1.如何使用XmlDocument读取Xml

我要用一段代码遍历所有Student,并打印Student的所有属性和子节点的值
?
/*玉开博客 http://www.cnblogs.com/yukaizhao/ */
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace XmlExample
{
    class Program
    {
        static void Main( string [] args)
        {
            string xmlFilePath = @"X:\about.net\example\XmlExample\1.xml" ;
            XmlDocument doc = new XmlDocument();
            doc.Load(xmlFilePath);
            //使用xpath表达式选择文档中所有的student子节点
            XmlNodeList studentNodeList = doc.SelectNodes( "/students/student" );
            if (studentNodeList != null )
            {
                foreach (XmlNode studentNode in studentNodeList)
                {
                    //通过Attributes获得属性名字为name的属性
                    string name = studentNode.Attributes[ "name" ].Value;
                    Console.WriteLine( "Student:" + name);
                    //通过SelectSingleNode方法获得当前节点下的courses子节点
                    XmlNode coursesNode = studentNode.SelectSingleNode( "courses" );
                    //通过ChildNodes属性获得courseNode的所有一级子节点
                    XmlNodeList courseNodeList = coursesNode.ChildNodes;
                    if (courseNodeList != null )
                    {
                        foreach (XmlNode courseNode in courseNodeList)
                        {
                            Console.Write( "\t" );
                            Console.Write(courseNode.Attributes[ "name" ].Value);
                            Console.Write( "老师评语" );
                            //通过FirstNode属性可以获得课程节点的第一个子节点,LastNode可以获得最后一个子节点
                            XmlNode teacherCommentNode = courseNode.FirstChild;
                            //读取CData节点
                            XmlCDataSection cdata = (XmlCDataSection)teacherCommentNode.FirstChild;
                            Console.WriteLine(cdata.InnerText.Trim());
                        }
                    }
                }
            }
            Console.Write( "\r\nPress any key to continue...." );
            Console.Read();
        }
    }
}
XmlDocument本身是从XmlNode继承的,读Xml节点可以通过FirstChild,LastChild,或者NextSibling,PreviousSibling读取单个节点,或者通过ChildNodes读取所有子节点。还可以使用XPath表达式使用SelectNodes(string xpath)或者SelectSingleNode(string xpath)读取单个或者多个符合条件的节点。
2.如何通过XmlDocument编辑Xml
同样是读取Xml中的xml例子,我们这次要用csharp代码生成xml,如下代码:
?
/*玉开博客 http://www.cnblogs.com/yukaizhao/ */
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace WriteXml
{
    class Program
    {
        static void Main( string [] args)
        {
            XmlDocument xmlDoc = new XmlDocument();
            //创建Xml声明部分,即<?xml version="1.0" encoding="utf-8" ?>
            xmlDoc.CreateXmlDeclaration( "1.0" , "utf-8" , "yes" );
            //创建根节点
            XmlNode rootNode = xmlDoc.CreateElement( "students" );
            //创建student子节点
            XmlNode studentNode = xmlDoc.CreateElement( "student" );
            //创建一个属性
            XmlAttribute nameAttribute = xmlDoc.CreateAttribute( "name" );
            nameAttribute .Value = "张同学" ;
            //xml节点附件属性
            studentNode.Attributes.Append(nameAttribute);
          
            //创建courses子节点
            XmlNode coursesNode = xmlDoc.CreateElement( "courses" );
            XmlNode courseNode1 = xmlDoc.CreateElement( "course" );
            XmlAttribute courseNameAttr = xmlDoc.CreateAttribute( "name" );
            courseNameAttr.Value = "语文" ;
            courseNode1.Attributes.Append(courseNameAttr);
            XmlNode teacherCommentNode = xmlDoc.CreateElement( "teacherComment" );
            //创建Cdata块
            XmlCDataSection cdata = xmlDoc.CreateCDataSection( "<font color=\"red\">这是语文老师的批注</font>" );
            teacherCommentNode.AppendChild(cdata);
            courseNode1.AppendChild(teacherCommentNode);
            coursesNode.AppendChild(courseNode1);
            //附加子节点
            studentNode.AppendChild(coursesNode);
            rootNode.AppendChild(studentNode);
            //附加根节点
            xmlDoc.AppendChild(rootNode);
            //保存Xml文档
            xmlDoc.Save( @"d:\test.xml" );
            Console.WriteLine( "已保存Xml文档" );
        }
    }
}

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

你可能感兴趣的:(C#操作Xml:通过XmlDocument读写Xml文档)