第一篇 -- XML基础

一、XML简介

  XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据。XML文档以.xml为后缀。需要彻底注意的是XML是区分大小写的

  先从一个简单的XML例子来了解下xml基础:

<?xml version="1.0" encoding="utf-8" ?>
<books ISBN="9787544238212">
  <title>xml学习笔记</title>
  <price>30</price>
  <pagecount>300</pagecount>
</books>

  第一行表明,本XML遵守的版本是1.0,使用的字符编码是UTF-8字符集。

  每个XML元素都已一个起始标记开始和一个结束标记结束。比如开始:<title>,结束:</title>。XML元素可以带有属性,属性值要加引号。比如上例中的ISBN就是属性,属性值要加双引号。同时用等号连接。

  一个XML文档只能够有一个根节点,如上例中books就是根节点。

  以下列出XML的几个要点:

  1. XML是一种可扩展标记语言;
  2. XML的标记没有被预定义,用户可以自行定义标记来描述数据;
  3. XML主要用来描述和存储数据;
  4. XML具有自我描述性;
  5. XML是树状结构的文档,是个结构化的文档;
  6. XML文档是个文本文件;

二、XML语法

  1. 每个开始标记都必须有结束标记;
  2. 一个XML文档只能够有一个根元素;
  3. 所有XML元素必须正确嵌套;
  4. 属性值必须加引号;
  5. 一个元素不能有相同的属性;

  下面以示例来解释XML常用的术语。

  1、标记

  标记分为开始标记和结束标记,如<title>就是一个开始标记。</title>就是一个结束标记。开始标记与结束标记之间的内容成为XML元素的内容。如果一个XML元素没有内容,我们称其为空元素。如<title></title>。

  2、元素

  XML元素是从一个开始标记到它结束标记的一段内容。比如 <title>XML学习笔记</title> 就是一个元素。

  3、属性

  一个元素可以带有属性,属性写在开始标记里,写在元素名称的后面。比如<books ISBN="9787544238212">,其中ISBN="9787544238212"就是books元素的一个属性。ISBN 是属性的名称, 9787544238212 是属性值。一个XML元素不能有相同的XML属性名

三、XML元素之间的关系

  1. 子节点;
  2. 父节点;
  3. 并列节点(兄弟关系);

  下面以一个例子来解释这三种关系。

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<father>Tom Smith
  <son>
    John Smith
    <grandson>Hans Smith</grandson>
  </son>
  <daughter>Jane Smith</daughter>
</father>
复制代码

    在上面的例子中,son元素就是father元素的子节点。father元素就是son元素和daughter元素的父节点。son元素和daughter又称并列节点。

  XML元素中可以带有属性作为XML元素的附加信息。

  如果属性值中包含双引号,就用单引号包围属性值。如:

<site info = 'wo "ai" ni'>

  如果属性值中包含单引号,就用双引号包围属性值。如:

<site info = "wo 'ai' ni">

  一个XML元素可以有一个或多个属性,每个属性用空格分开。如:

  <person name="zhangsan" age="23">

四、XML名称命名规则

  XML的名称可以包含英文字母和数字,或者其他字符比如下划线。XML名称不能以数字或者标点符号开头,XML不能以xml开头(或者xml的大小写,因为这是XML相关标准的保留词)。XML名称不能包含空格,虽然XML名称支持下划线(_)、连字符(-)、句号(.)和冒号(:),但XML开头不能使用连字符(-)、句号(.)和冒号(:)。

   1、XML实体应用

  (1)、在XML标记里除了表示一个标记的开始之外,不允许有小于号<,因为小于号总是被XML解析器解释为一个标记的开始。

  如 :

<person> if age < 10 </person>

  这行代码是错误的,如果一定要在XML元素内容里书写小于号,那么可以使用小于号的实体引用,即:&lt; 来替换小于号。

  如:

<person> if age &lt; 10</person>

  是正确的写法。

  (2)在XML里也不能使用&这个字符,因为&被解释为某个实体引用的开始。所以必须使用&的实体引用&amp; 来代替&。

  如:

  • <person>a & b</person>     是错误的
  • <person>a &amp; b</person>  是正确的

  下面给出XML5个预定的实体引用

实体引用 字符 说明
&lt; < 小于号
&gt; > 大于号
&amp; &
&apos; ' 单引号
&quot; " 双引号

  当XML解析器解析含有上述实体引用的XML文档时,会将这些实体引用转换成相应的字符。

  只有<和&在XML是非法的。另外几个是合法的,可以直接写,只是用实体引用更加清晰而已。    

  2、XML CDATA区

  当需要往XML文档里添加一段内容,而内容里有很多<或者&的时候,将所有<或&转换为实体引用是很麻烦的事情,这时候可以使用CDATA区,在CDATA区里不必使用实体引用,因为XML解析器不会计算CDATA区里的内容。

  CDATA区以   <![CDATA[  开始 ,以  ]]>  结束

  示例如下:

复制代码
     <mycode>
        <![CDATA[
          <html>
            <title></title>
            <body></body>
          </html>
        ]]>
     </mycode>
复制代码

   需要注意的是:在CDATA区内,不能出现 ]]>

  3、XML注释

  XML注释以  <!--  开始,以  -->  结束。

  示例:

<!-- 这是注释 -->

  在XML注释里面,除了结束符-->,不能出现两个连字符--。XML注释也可以放在元素内容里。

  4、XML声明

  XML文档应当以XML声明开始,不过不是必须的。

  示例:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<person>
    张三
</person>

  如果一个XML文档含有声明,必须放在XML文档的第一行。

  XML文档声明主要有三个参数。

  1. 版本:版本表示遵循的是W3C的XML1.0标准。
  2. 字符编码:字符编码表示该XML文档使用的字符编码方式。对于中文文档,应该使用UTF-8或者Unicode。如果是纯英文,可以使ISO-8859-1编码。
  3. 独立:如果XML standalone的值是no,表示它需要DTD。不需要DTD的XML文档,standalone的值应该写为yes。

  5、格式正确的XML文档。

  • 每个开始标记必须有结束标记。
  • XML文档只有一个根元素。
  • XML元素必须被正确嵌套。
  • XML元素不能有相同名称的属性。
  • XML属性值必须加引号。
  • XML注释不能卸载标记里。
  • XML文档里不能出现<和&标记。必须用实体引用代替。

  6、XML命名空间

  XML命名空间是为了解决当XML文档中存在多个相同名称的元素时,避免冲突而引入的。

  命名空间的语法:

  • xmlns:prefix="URI"
  • xmlns:表示必须的属性。
  • prefix:表示命名空间的别名,它的值不能为xml。
  • URI:用来标识抽象或物理资源的的紧凑字符串。为了保证标识的唯一性,xml采用Internet上的网址作为这个标识符,因为网址是独一无二的。

  默认命名空间示例:

<?xml version="1.0" encoding="utf-8" ?>
<Article xmlns="http://www.xxx.com/"> <!--默认命名空间-->
  <author age="30">张三</author>
  <length>12000</length>
  <price>42</price>
</Article>

  带名字的命名空间|:

<?xml version="1.0" encoding="utf-8" ?>
<h:Article xmlns:h="http://www.xxx.com/"> <!--带前缀的命名空间-->
  <h:author age="30">张三</h:author>
  <h:length>12000</h:length>
  <h:price>42</h:price>
</h:Article>

  7、DTD和XML Schema

  DTD文档类型定义,是一套关于标记符的语法规则。它是XML1.0班规格的一部分,是XML文件的验证机制。属于XML文件组成的一部分。DTD是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。一个DTD文档包括:元素的定义规则,元素间关系的定义规则,元素可使用的属性、可使用的实体或符号规则。不同的公司之需定义好标准的DTD,个公司都能够依照DTD建立XML文件,并且进行验证,如此就可以轻易的建立标准与交换数据。这样便满足了网络共享和数据交互。

  DTD文件是一个ASCII的文本文件,后缀名为.dtd。每一个XML文档都可以携带一个DTD,用来对该文档格式进行描述,测试该文档是否为有效的XML文档。

  XML Schema如果DTD一样是负责定义和描述XML文档的结构和内容模式的。它可以定义XML文档中存在哪些元素和元素之间的关系,并且可以定义元素和属性的数据类型。是针对DTD的某些缺点,如:DTD不支持数据类型,扩展性较差等而出现的。

  XML Schema具有以下优点:

  •   一致性:Schema使得XML得定义不必再利用一种特定的形式化语言,而是直接借助XML自身的特性,利用XML的基本语法规则来定义XML文档的结构。
  •   扩展性:Schema对DTD进行了扩充,引入了数据类型,命名空间,从而具备较强的可扩展性。
  •   互换性:利用Schema,我们能够书写XML文档以及验证文档的合法性。另外通过特性的映射机制,还可以将不同的Schema进行转换,以实现更高层次的数据交换。
  •   规范性:同DTD一样,Schema野提供了一套完整的机制以约束XML文档中的标记的使用。相比之下Schema基于XML,更具有规范性。
  •   XML Schema的限制功能例如:那些元素可以出现在文档中,元素间的关系是什么,每个元素有那些内容和属性以及元素出现的顺序和次数等等。

出处:https://www.cnblogs.com/kissdodog/archive/2013/02/24/2923991.html

=====================================================================================

  XmlDocument类是.NET框架的DOC解析器。XmlDocument将XML视为树状结构,它装载XML文档,并在内存中构建该文档的树状结构。下面来看下XmlDocument提供了哪些功能。

  一、属性:

Attributes      获取一个 XmlAttributeCollection,它包含该节点的属性。 (继承自 XmlNode。)
BaseURI          获取当前节点的基 URI。 (重写 XmlNode..::.BaseURI。)
ChildNodes      获取节点的所有子节点。 (继承自 XmlNode。)
DocumentElement   获取文档的根 XmlElement。
DocumentType    获取包含 DOCTYPE 声明的节点。
FirstChild       获取节点的第一个子级。 (继承自 XmlNode。)
HasChildNodes     获取一个值,该值指示节点是否有任何子节点。 (继承自 XmlNode。)
Implementation     获取当前文档的 XmlImplementation 对象。
InnerText        获取或设置节点及其所有子节点的串联值。 (继承自 XmlNode。)
InnerXml       获取或设置表示当前节点子级的标记。 (重写 XmlNode..::.InnerXml。)
IsReadOnly      获取一个值,该值指示当前节点是否是只读的。 (重写 XmlNode..::.IsReadOnly。)
Item          已重载。
LastChild       获取节点的最后一个子级。 (继承自 XmlNode。)
LocalName       获取节点的本地名称。 (重写 XmlNode..::.LocalName。)
Name         获取节点的限定名。 (重写 XmlNode..::.Name。)
NamespaceURI    获取该节点的命名空间 URI。 (继承自 XmlNode。)
NameTable      获取与此实现关联的 XmlNameTable。
NextSibling       获取紧接在该节点之后的节点。 (继承自 XmlNode。)
NodeType       获取当前节点的类型。 (重写 XmlNode..::.NodeType。)
OuterXml        获取表示此节点及其所有子节点的标记。 (继承自 XmlNode。)
OwnerDocument   获取当前节点所属的 XmlDocument。 (重写 XmlNode..::.OwnerDocument。)
ParentNode       已重载。
Prefix          获取或设置该节点的命名空间前缀。 (继承自 XmlNode。)
PreserveWhitespace  获取或设置一个值,该值指示是否在元素内容中保留空白。
PreviousSibling    获取紧接在该节点之前的节点。 (继承自 XmlNode。)
SchemaInfo      返回节点的后架构验证信息集 (PSVI)。 (重写 XmlNode..::.SchemaInfo。)
Schemas       获取或设置与此 XmlDocument 关联的 XmlSchemaSet 对象。
Value         获取或设置节点的值。 (继承自 XmlNode。)
XmlResolver      设置 XmlResolver 以用于解析外部资源。

二、方法

AppendChild              将指定的节点添加到该节点的子节点列表的末尾。 (继承自 XmlNode。)
Clone                   创建此节点的一个副本。 (继承自 XmlNode。)
CloneNode               创建此节点的一个副本。 (重写 XmlNode..::.CloneNode(Boolean)。)
CreateAttribute            已重载。 创建具有指定名称的 XmlAttribute。
CreateCDataSection         创建包含指定数据的 XmlCDataSection。
CreateComment           创建包含指定数据的 XmlComment。
CreateDefaultAttribute         创建具有指定前缀、本地名称和命名空间 URI 的默认属性。
CreateDocumentFragment        创建 XmlDocumentFragment。
CreateDocumentType          返回新的 XmlDocumentType 对象。
CreateElement             已重载。 创建 XmlElement。
CreateEntityReference          创建具有指定名称的 XmlEntityReference。
CreateNavigator            已重载。 创建一个用于导航此文档的新 XPathNavigator 对象。
CreateNode              已重载。 创建 XmlNode。
CreateProcessingInstruction     创建一个具有指定名称和数据的 XmlProcessingInstruction。
CreateSignificantWhitespace     创建一个 XmlSignificantWhitespace 节点。
CreateTextNode           创建具有指定文本的 XmlText。
CreateWhitespace          创建一个 XmlWhitespace 节点。
CreateXmlDeclaration         创建一个具有指定值的 XmlDeclaration 节点。
GetElementById           获取具有指定 ID 的 XmlElement。
GetElementsByTagName        已重载。 返回一个 XmlNodeList,它包含与指定名称匹配的所有子代元素的列表。
GetEnumerator            提供对 XmlNode 中节点上“for each”样式迭代的支持。 (继承自 XmlNode。)
GetHashCode              用作特定类型的哈希函数。 (继承自 Object。)
GetNamespaceOfPrefix         查找当前节点范围内离给定的前缀最近的 xmlns 声明,并返回声明中的命名空间 URI。 (继承自 XmlNode。)
GetPrefixOfNamespace         查找当前节点范围内离给定的命名空间 URI 最近的 xmlns 声明,并返回声明中定义的前缀。 (继承自 XmlNode。)
ImportNode             将节点从另一个文档导入到当前文档。
InsertAfter               将指定的节点紧接着插入指定的引用节点之后。 (继承自 XmlNode。)
InsertBefore             将指定的节点紧接着插入指定的引用节点之前。 (继承自 XmlNode。)
Load                  已重载。 从 Stream、URL、TextReader 或 XmlReader 加载指定的 XML 数据。
LoadXml                从指定的字符串加载 XML 文档。
Normalize              将此 XmlNode 下子树完全深度中的所有 XmlText 节点都转换成“正常”形式,在这种形式中只有标记(即标记、注释、处理指令、                    CDATA 节和实体引用)分隔 XmlText 节点,也就是说,没有相邻的 XmlText 节点。 (继承自 XmlNode。)
PrependChild             将指定的节点添加到该节点的子节点列表的开头。 (继承自 XmlNode。)
ReadNode               根据 XmlReader 中的信息创建一个 XmlNode 对象。读取器必须定位在节点或属性上。
RemoveAll               移除当前节点的所有子节点和/或属性。 (继承自 XmlNode。)
RemoveChild             移除指定的子节点。 (继承自 XmlNode。)
ReplaceChild             用 newChild 节点替换子节点 oldChild。 (继承自 XmlNode。)
Save                 已重载。 将 XML 文档保存到指定的位置。
SelectNodes              已重载。
SelectSingleNode           已重载。
Supports               测试 DOM 实现是否实现特定的功能。 (继承自 XmlNode。)
Validate               已重载。 验证 XmlDocument 是不是 Schemas 属性中包含的 XML 架构定义语言 (XSD) 架构。
WriteContentTo           将 XmlDocument 节点的所有子级保存到指定的 XmlWriter 中。 (重写 XmlNode..::.WriteContentTo(XmlWriter)。)
WriteTo               将 XmlDocument 节点保存到指定的 XmlWriter。 (重写 XmlNode..::.WriteTo(XmlWriter)。)

 三、事件

NodeChanged        当属于该文档的节点的 Value 已被更改时发生。
NodeChanging       当属于该文档的节点的 Value 将被更改时发生。
NodeInserted         当属于该文档的节点已被插入另一个节点时发生。
NodeInserting        当属于该文档的节点将被插入另一个节点时发生。
NodeRemoved        当属于该文档的节点已被从其父级移除时发生。
NodeRemoving       当属于该文档的节点将被从文档中移除时发生。

助记属性:

PreviousSibling  上一个兄弟节点
NextSibling    下一个兄弟节点
FirstChild     第一个子节点
LastChild     最后一个子节点
ChildNodes    子节点集合
ParentNode     父节点

代码示例:

xml文档:

<?xml version="1.0" encoding="utf-8" ?>
<Article>
  <author age="30">张三</author>
  <length>12000</length>
  <price>42</price>
</Article>

代码:

复制代码
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(@"C:UsersAdministratorDesktopConsoleApplication1ConsoleApplication1Test.xml");
            //先获取一个唯一的Article节点,再获取其下的第一个子节点 然后再获取该节点下的属性集合
            XmlAttributeCollection xc = doc.SelectSingleNode("Article").FirstChild.Attributes;
            string age = xc[0].Value;   //不过是一个定制的集合罢了,还是集合那套东西 //string age = xc["age"].Value; 支持两种索引访问
            Console.WriteLine(age);     //输出30

            string baseuri = doc.SelectSingleNode("Article").FirstChild.BaseURI;    
            Console.WriteLine(baseuri);     //输出 file:///C:UsersAdministratorDesktopConsoleApplication1ConsoleApplication1Test.xml

            XmlNodeList listNode = doc.SelectSingleNode("Article").ChildNodes;  //获取Article节点下的所有节点列表
            for (int i = 0; i < listNode.Count;i++ )    //XmlNodeList不支持foreach遍历,只能用for
            {
                Console.Write(listNode[i].Name + " : " + listNode[i].InnerText);    //输出 author:张三 length:12000 price:30    Name获取的是限定名,也就是标记名称
            }

            XmlElement xe = doc.DocumentElement;    //获取根节点
            Console.WriteLine(xe.Name);     //输出 Article    

            //XmlDocumentType xdt = doc.DocumentType;     //获取包含 DOCTYPE 声明的节点。应该是由DTD限定的节点。
            //Console.Write(xdt.Name);  //此处报 未将对象引用设置到对象的实例,因为找不到有DOCTYPE声明的元素

            Console.WriteLine(doc.HasChildNodes);    //输出 True 当前Document是否包含子节点。

            //XmlImplementation xi = doc.Implementation;    //不懂怎么用
            //xi.ToString();    


            Console.WriteLine(doc.InnerText);   //获取当前文档的内容 输出 张三 12000 30
            Console.WriteLine(doc.InnerXml);    //输出 整个Xml文件的字符串内容
            Console.WriteLine(doc.IsReadOnly);  //获取当前文档是否是只读的。输出 False
            XmlNode node = doc.LastChild;
            Console.WriteLine(node.InnerText);  //输出 张三 12000 30    因为最后一个节点是Article节点,输出Article节点的所有内容
            Console.WriteLine(doc.LocalName);   //输出 #document 
            Console.WriteLine(doc.SelectSingleNode("Article").Name);    //输出Article
            Console.WriteLine(doc.SelectSingleNode("Article").FirstChild.NextSibling.Name);     //length author的下一个兄弟节点 是length
            XmlNodeType xnt = doc.SelectSingleNode("Article").NodeType;
            Console.WriteLine(xnt);  //输出Element,表明该节点是元素节点 
            string str = doc.SelectSingleNode("Article").OuterXml;  //此节点及其所有自己点标记,输出Article节点的所有内容 <Article>省略...</Article>
            Console.WriteLine(str);
            XmlDocument x = new XmlDocument();
            x.LoadXml(str);

            Console.WriteLine(doc.SelectSingleNode("Article").OwnerDocument);   //获取该节点所属的XmlDocument
            XmlNode xn = doc.SelectSingleNode("Article").LastChild.ParentNode;  //ParentNode获取直接父节点。
            Console.WriteLine(xn.Name); //输出 Article

            Console.WriteLine(doc.PreserveWhitespace);  //是否保留空白    输出False
            XmlNode xn1 = doc.SelectSingleNode("Article").LastChild.PreviousSibling;
            Console.WriteLine(xn1.Name);    //输出length 的确是最后一个节点的前一个节点。

            Console.ReadKey();
        }
复制代码

    为了更加好的展示一些属性,现在将xml换成这样:

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<h:Article xmlns:h = "http://www.xxx.com/">
  <!--默认命名空间-->
  <h:author age="30">张三</h:author>
  <h:length>12000</h:length>
  <h:price>42</h:price>
</h:Article>
复制代码

   代码如下:

复制代码
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(@"C:UsersAdministratorDesktopConsoleApplication1ConsoleApplication1Test.xml");
            XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable);
            xnm.AddNamespace("h", "http://www.xxx.com/");
            XmlNode Article = doc.SelectSingleNode("h:Article", xnm);
            string namespace1 = Article.InnerText;
            Console.WriteLine(namespace1);      //输出 张三 12000 30

            Console.WriteLine(Article.Prefix);  //输出 h  获取当前节点的前缀
            Console.WriteLine(Article.NamespaceURI);    //输出 http://www.xxx.com/123  获取当前节点所在的命名空间

            Console.WriteLine(Article.FirstChild.Name + "---" + Article.FirstChild.Value + "---" + Article.FirstChild.LocalName);
            //以上一行代码输出 h:author------author

             //SchemaInfo 返回节点的后架构验证信息集 (PSVI)。//Value 获取或设置节点的值。 (继承自 XmlNode。) 
             //XmlResolver 设置 XmlResolver 以用于解析外部资源。  

            Console.ReadKey();
        }
复制代码

 再来一个展示一下Schemas这个常用的属性

复制代码
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();    //创建文档
            doc.Schemas.Add(null, @"C:UsersAdministratorDesktopConsoleApplication1ConsoleApplication1person.xsd");    //添加一个架构对象到本XmlDocument
            doc.Load(@"C:UsersAdministratorDesktopConsoleApplication1ConsoleApplication1person.xml");     //加载xml文件
            Console.WriteLine(doc.Schemas.Count);   //输出1 就是第二行添加的那个
            Console.WriteLine(doc.SchemaInfo.MemberType); 
            //XmlResolver 设置 XmlResolver 以用于解析外部资源。  

            Console.ReadKey();
        }
复制代码

     下面来试下XmlDocument的方法

    Test.xml的代码如下:
复制代码
<?xml version="1.0" encoding="utf-8" ?>
<bookstore>
  <book>
    <id>1</id>
    <title lang="属性1">三国演义</title>
    <author>罗贯中</author>
    <year>2005</year>
    <price id='a1"'>38.5</price>
  </book>
  <book>
    <id>2</id>
    <title lang="属性2">西游记</title>
    <author>吴承恩</author>
    <year>2004</year>
    <price>37.5</price>
  </book>
</bookstore>
复制代码

     主程序代码如下:

复制代码
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();    //创建文档
            doc.Load(@"C:UsersAdministratorDesktopConsoleApplication1ConsoleApplication1Test.xml");     //加载xml文件

            XmlNode node1 = doc.CreateNode(XmlNodeType.Element, "pagecount", null);
            node1.InnerText = "222";
            doc.SelectSingleNode("/bookstore").AppendChild(node1); //执行之后 <pagecount>222</pagecount>元素被添加到</bookstore>前面
            doc.Save(@"D:123.xml");

            XmlNode node2 = doc.SelectSingleNode("/bookstore/book[1]/title[1]").Clone();    //克隆一个节点出来
            Console.WriteLine(node2.InnerText);     //输出三国演义

            XmlNode node3 = doc.SelectSingleNode("/bookstore/book[1]/title[1]").CloneNode(true);   //参数决定是否克隆子节点数(如果false,文本节点也不克隆) 
            Console.WriteLine(node3.InnerText);     //输出三国演义

            XmlAttribute attr = doc.CreateAttribute("age");     //创建一个age属性
            attr.Value = "23";
            doc.SelectSingleNode("/bookstore/book[1]/author[1]").Attributes.Append(attr);   //执行之后第一个作者变为 <author age="23">罗贯中</author>
            doc.Save(@"D:123.xml");

            XmlCDataSection cdata = doc.CreateCDataSection("我&你");
            doc.SelectSingleNode("/bookstore/book[1]/author[1]").AppendChild(cdata);        //执行之后author变为<author age="23">罗贯中<![CDATA[我&你]]></author>
            doc.Save(@"D:123.xml");

            XmlComment com = doc.CreateComment("2013-2-27 22:37:25");
            doc.SelectSingleNode("/bookstore/book[1]/title[1]").AppendChild(com);   //执行之后title变为<title lang="属性1">三国演义<!--2013-2-27 22:37:25--></title>
            doc.Save(@"D:123.xml");

            XmlDocument doc1 = new XmlDocument();
            XmlDocumentFragment xdf = doc1.CreateDocumentFragment();    //一个xml片段,这个类敢情好用
            xdf.InnerXml = "<item>widget</item>";
            doc1.AppendChild(xdf);
            Console.WriteLine(doc1.OuterXml);   //输出<item>widget</item>

            //CreateDefaultAttribute         创建具有指定前缀、本地名称和命名空间 URI 的默认属性。 
            //CreateDocumentType          返回新的 XmlDocumentType 对象。 

            XmlDocument doc2 = new XmlDocument();
            XmlElement element = doc2.CreateElement("title");   //创建一个title 如果现在保存是输出<title/> 因为还没有内容
            doc2.AppendChild(element);
            XmlEntityReference xer = doc2.CreateEntityReference("h");
            doc2.LastChild.AppendChild(xer);
            Console.WriteLine(doc2.OuterXml);   //输出</title>&h;</title>

            XPathNavigator nav = doc2.CreateNavigator();    //一个通过光标的导航模型遍历XML文档的数据

            XmlText text = doc2.CreateTextNode("你好啊");  //创建一个文本节点
            doc2.SelectSingleNode("/title").AppendChild(text);
            Console.WriteLine(doc2.OuterXml);   //输出</title>&h;你好啊</title>

            XmlWhitespace xws = doc2.CreateWhitespace("     ");     //创建一个空白节点
            doc2.SelectSingleNode("/title").AppendChild(xws);
            Console.WriteLine(doc2.OuterXml);   //输出</title>&h;你好啊     </title>

            XmlDeclaration xd = doc2.CreateXmlDeclaration("1.0", "utf-8", "yes");  //xml头  XML声明部分
            XmlNode root = doc2.SelectSingleNode("/title");
            doc2.InsertBefore(xd, root);
            Console.WriteLine(doc2.OuterXml);   //执行之后 在头部加入了<?xml version="1.0" encoding="utf-8" standalont="yes"?>

            XmlSignificantWhitespace xsw = doc2.CreateSignificantWhitespace("      ");
            XmlElement ele = doc2.CreateElement("white");
            ele.InnerText = "空白啊空白";
            ele.AppendChild(xsw);
            doc2.SelectSingleNode("/title").AppendChild(ele);
            Console.WriteLine(doc2.OuterXml);       //还是添加一大堆空白,不知道与CreateWhitespace有什么区别

            XmlDocument doc3 = new XmlDocument();
            String PItext = "type='text/xsl' href='book.xsl'";
            XmlProcessingInstruction newPI = doc3.CreateProcessingInstruction("xml-stylesheet", PItext);
            doc3.AppendChild(newPI);
            Console.WriteLine(doc3.OuterXml);   //输出 <?xml-stylesheet type="text/xsl" hred="book.xsl"?>
            //GetElementById           获取具有指定 ID 的 XmlElement。 
            //GetElementsByTagName        已重载。 返回一个 XmlNodeList,它包含与指定名称匹配的所有子代元素的列表。 
            //GetEnumerator            提供对 XmlNode 中节点上“for each”样式迭代的支持。 (继承自 XmlNode。) 
            //GetNamespaceOfPrefix         查找当前节点范围内离给定的前缀最近的 xmlns 声明,并返回声明中的命名空间 URI。 (继承自 XmlNode。) 
            //GetPrefixOfNamespace         查找当前节点范围内离给定的命名空间 URI 最近的 xmlns 声明,并返回声明中定义的前缀。 (继承自 XmlNode。) 
            //ImportNode             将节点从另一个文档导入到当前文档。 
            //InsertAfter               将指定的节点紧接着插入指定的引用节点之后。 (继承自 XmlNode。) 
            //InsertBefore             将指定的节点紧接着插入指定的引用节点之前。 (继承自 XmlNode。) 

            //LoadXml                从指定的字符串加载 XML 文档。 
            //Normalize              将此 XmlNode 下子树完全深度中的所有 XmlText 节点都转换成“正常”形式,在这种形式中只有标记(即标记、注释、处理指令、                    CDATA 节和实体引用)分隔 XmlText 节点,也就是说,没有相邻的 XmlText 节点。 (继承自 XmlNode。) 
            //PrependChild             将指定的节点添加到该节点的子节点列表的开头。 (继承自 XmlNode。) 
            //ReadNode               根据 XmlReader 中的信息创建一个 XmlNode 对象。读取器必须定位在节点或属性上。 
            //RemoveAll               移除当前节点的所有子节点和/或属性。 (继承自 XmlNode。) 
            //RemoveChild             移除指定的子节点。 (继承自 XmlNode。) 
            //ReplaceChild             用 newChild 节点替换子节点 oldChild。 (继承自 XmlNode。) 


            //Supports               测试 DOM 实现是否实现特定的功能。 (继承自 XmlNode。) 
            //Validate               已重载。 验证 XmlDocument 是不是 Schemas 属性中包含的 XML 架构定义语言 (XSD) 架构。 
            //WriteContentTo           将 XmlDocument 节点的所有子级保存到指定的 XmlWriter 中。 (重写 XmlNode..::.WriteContentTo(XmlWriter)。) 
            //WriteTo               将 XmlDocument 节点保存到指定的 XmlWriter。 (重写 XmlNode..::.WriteTo(XmlWriter)。)
            Console.ReadKey();
        }
复制代码

出处:https://www.cnblogs.com/kissdodog/archive/2013/02/24/2924236.html

原文地址:https://www.cnblogs.com/mq0036/p/11556686.html