管理XML文档的类:XmlDocument类
XmlDocument类描述XML文档对象的类。如前所述,DOM将一切XML对象抽象为节点,因此XmlDocument继承于XmlNode类。该类具有XmlNode类的所有特征,并包含了一些针对XML文档设计的特点。
XmlDocument类作为描述XML文档对象的类,在进行实例化时,可以由XmlReader打开一个现有的XML文档,也可以根据自身的构造函数创建一个XML文档对象。当XmlDocument对象被创建或赋值时,将在内存中生成一个描述XML文档的类,可以在这个对象范围内,对指定的XML文档执行导航和写入的操作。
由于XmlDocument类提供了快捷的导航方式,因此不需要在程序中遍历其节点。尽管由于实现DOM的关系,XmlDocument本身也提供了遍历的方法,然而这不是W3C所推荐的。也就是说,相对于XmlDocument本身提供的导航方法而言,遍历节点的方法效率不高。
语法定义:
public class XmlDocument: XmlNode
下面的代码演示了使用不同的方法建立XmlDocument的实例:
//使用默认的构造函数构造一个XML文档类实例
System.Xml.XmlDocument myXmlDocument = new System.Xml.XmlDocument();
//使用XmlNameTable创建一个具有原子化字符串的XML文档实例
Sytem.Xml.XmlNameTable myNameTable = new System.Xml.NameTable();
System.Xml.XmlDocument myXmlDocument = new System.Xml.XmlDocument(myNameTable);
方法详解:
AppendChild
将指定的节点添加到该节点的子节点列表的末尾
CreateCDataSection:创建CData节点
CreateComment:创建注释节点
CreateDocumentFragment : 创建Xml文档片断
CreateDocumentType : 创建新的XML文档类型
CreateElement
创建一个XML元素
CreateNode:创建一个节点
CreateTextNode :创建文本节点
GetElementById : 获得指定ID的Element
GetElementsByTagName
返回一个XmlNodeList,它包含与指定名称匹配的所有子代元素的列表
GetEnumerator
提供对XmlNode中节点上For Each样式迭代的支持
InsertAfter
将指定的节点紧接着插入指定的引用节点之后
InsertBefore
将指定的节点紧接着插入指定的引用节点之前
RemoveChild
删除某个子节点
Save
将Dom对象保存为XML文件
Load
装载指定的XML文档
LoadXml
直从指定的字符串加载 XML 文档。
应用:XML文件之间的数据交换
XmlDocument类提供了对XML文档的多方面操作,从而能够在两个XML文档之间,根据需要进行灵活多样的数据交换。因为每个XML的DOM标准对象都继承于抽象的XmlNode类,所以不同类型的节点之间的数据交换也很方便。
本例的目的是演示如何抽取一个XML文档中所包含的有效数据,并将这些数据赋予另一个XML文档。实例的演示步骤如下。
1、编写一个“Book.xml”文件。内容如下:
<?xml version="1.0"?>
<store>
<book id = "1" genre="novel" publicationdate="1997" ISBN="1-861001-57-5">
<title>Pride And Prejudice</title>
<price>24.95</price>
</book>
<book id = "2" genre="business" publicationdate="2003" ISBN="4-746623-03-2">
<title>Custumor Manger</title>
<price>31.46</price>
</book>
</store>
2、编写一个XML文件,默认名“NewBook.xml”。内容如下:
<store>
<book id="1">
<ISBN>1-861001-57-5</ISBN>
<title>Pride And Prejudice</title>
<price></price>
<year>1996</year>
</book>
<book id="2">
<ISBN>4-746623-03-2</ISBN>
<title>Pride And Prejudice</title>
<price></price>
<year>2003</year>
</book>
</store>
3、新建一个windows控制台程序,命名为“ConverBook”。
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace ConverBook
{
class Program
{
static void Main(string[] args)
{
XmlDocument docbook = new XmlDocument();
XmlDocument docnewbook = new XmlDocument();
docbook.Load(@"C:\Book.xml");//加载源XML数据文件
docnewbook.Load(@"C:\NewBook.xml");//加载目标XML数据文件
XmlNode root = docbook.DocumentElement;
XmlNode rootnew = docnewbook.DocumentElement;
//将Book.xml的节点导入NewBook.xml
for (int i = 0; i < root.ChildNodes.Count; i++)
{
String id = root.ChildNodes[i].Attributes["id"].Value; //从子节点列表中获取数据
String price = root.ChildNodes[i].ChildNodes[1].InnerText;
//使用xpath选取节点并赋值
rootnew.SelectSingleNode("/store/book[@id=" + id + "]/price").InnerText = price;
}
docnewbook.Save(@"C:\NewBook.xml");//保存更改后的XML文档数据
Console.WriteLine("数据导入完成,请按任意键继续……");
Console.ReadLine();
}
}
}
5、按F5运行程序,重新使用文本编辑器打开NewBook.xml文件,可以看见文件内容已经改变,其中price节点已经被重新赋值了,如下所示: