XML仅仅是一种信息交换的载体和方法。如果要使用XML文档则必须通过使用一种称为接口的技术。使用DOM接口应用程序对XML文档的访问变得简单。

DOM是一个程序接口,应用程序和脚本可以通过这个接口访问和修改XML文档数据。DOM接口将XML文档转换为树型的文档结构,应用程序通过树型文档对XML文档进行层次化访问,从而实现对XML文档的操作,例如访问树节点、创建新节点等。

一. DOM接口简介

.NET类库中支持DOM(Document Object Model,文档对象模型)的类主要存在于System.Xml和System.Xml.XmlDocument命名空间中。这些类分为两个层次:基础类和扩展类。

基础类包括用来编写操纵XML文档的应用程序所需要的类;

扩展类被定义用来简化程序员的开发工作的类。

1. 基础类包含如下3类:

  • XMlNode类用来表示文档树中的单个节点,它描述了XML文档中各种具体节点类型的共性;
  • XmlNodeList类用来表示一个节点的有序集合,它提供了对迭代操作和索引器的支持;
  • XmlNamedNodeMap类用来表示一个节点的集合,该集合中的元素可以使用节点名或索引来访问,支持使用节点名称和迭代器来对属性集合的访问,并且包含对命名空间的支持。

2. 扩展类中包含由XmlNode类派生出来的类,具体如下:

描述
XmlAttribute 表示一个属性,此属性的有效值和默认值在DTD或架构中进行定义。
XmlAttributeCollection 表示属性集合,这些属性的有效值和默认值在DTD或架构中进行定义。
XmlComment 表示XML文档中的注释内容。
XmlDocument 表示XML文档。
XmlDocumentType 表示XML文档的DOCTYPE声明节点。
XmlElement 表示一个元素。
XmlEntity 表示XML文档中一个解析过或未解析过的实体。
XmlEntityReference 表示一个实体的引用。
XmlLinkedNode 获取紧靠该节点(之前或之后)的节点。
XmlReader 是一个抽象类,是快速、无缓冲、向前并只读的游标,用于读取XML文档,并且隐藏了底层数据交换的复杂性。
XmlText 表示元素或属性的文本内容。
XmlTextReader 是继承与XmlReader的,是快速、无缓冲、向前并只读的游标,并可以设定可以设定Encoding。
XmlTextWriter 表示提供快速、非缓存、只读方法的编写器,该方法生成XML数据的流或文件。
XmlWriter 表示提供快速、非缓存和只进方法的编写器,该方法生成XML数据。

二. 创建XmlDocument

创建文档XML等方法有如下两种:

1. 创建不带参数的XmlDocument

语法如下:

System.Xml.XmlDocument doc = new XmlDocument();

2. 创建带参数的XmlDocument

语法如下:

System.Xml.XmlDocument doc = new XmlDocument(xmlNameTable);

通常创建一个XmlDocument后,将XmlNameTable作为参数传递给它。XmlNameTable类是原子化字符串(重要的字符串,可以提升符号管理和文件名管理)对象的表。该表为XML分析器提供了一种高效的方法,即对XML文档中所有重复的元素和属性名使用相同的字符串对象。创建文档时,将自动创建XmlNameTable,并在加载此文档时用属性和元素名加载XmlNameTable。

三. 读入XML文档

XML信息可以从不同的格式读入内存,读取源包括字符串、流、URL、文件读取器或XmlReader的派生类。Load方法可以将文档置入内存中,另外LoadXML方法可以从字符串中读取XML。

实例:

// 创建文档
XmlDocument doc = new XmlDocument(); 

doc.LoadXml("<product>" + 
    "<item>" + 
    "<name> Apple </name>" +
    "<price> 15 </price>" + 
    "<color> red </color>" +
    "</item>" +
    "<item>" +
    "<name> Banana </name>" +
    "<price> 20 </price>" + 
    "<color> yellow </color>" +
    "</item>" +
    "</product>");

// 把文档保存到一个文件中
doc.Save("fruit.xml");

在上面的例子中,使用LoadXML方法加载了XML,然后将数据保存到一个名为"apple.xml"的文本文件中。

四. 创建新节点

XmlDocument中的Create方法能够被用于所有的节点类型,通过该方法可以创建包含指定名称、指定数据内容的节点或其他参数。

XmlDocument常用的创建节点方法信息如下:

方法 描述
CreateAttribute 创建具有指定名称的XmlAttribute。
CreateCDataSection 创建包含指定数据的XmlCDataSection。
CreateComment 创建包含指定数据的XmlComment。
CreateDocumentType 返回新的XmlDocumentType对象。
CreateElement 创建XmlElement。
CreateEntityReference 创建具有指定名称的XmlEntityReference。
CreateNode 创建XmlNode。
CreateTextNode 创建具有指定文本的XmlText。

创建新节点后,可以使用专用方法将其插入到XM了结构树种。将节点插入XML结构树中的方法如下:

方法 描述
InsertBefore 插入到引用节点之前。
InsertAfter 插入到引用节点之后。
AppendChild 将节点添加到给定节点的子节点列表的末尾。
PrependChild 将节点添加到给定节点的子节点列表的开头。
Append 将XmlAttribute节点添加到与元素关联的属性集合的末尾。

五. 修改XML文档

在.NET框架下,用户可以用多种方法来修改XML文档的节点、内容和值。其中常用的修改XML文档的方法说明如下:

  • (1)使用XmlNode.Value方法更改节点值;
  • (2)通过用新节点替换节点来修改全部节点集。可使用XmlNode.InnerXml属性完成;
  • (3)使用XmlNode.ReplaceChild方法用新节点替换现有节点;
  • (4)使用XmlCharacterData.AppendData方法、XmlCharacterData.InsertData方法或XmlCharacterData.ReplaceData方法将附加字符串添加到XmlCharacter类继承的节点;
  • (5)对从XmlCharacterData继承的节点类型使用DeleteData方法移除某个范围的字符来修改内容;
  • (6)使用SetAttribute方法更新属性值。如果不存在属性,SetAttribute创建一个心属性;如果存在属性,则更新属性值。

六. 删除XML文档的节点、属性和内容

1. 删除节点

如果要从DOM中移除节点,可以使用RemoveChild方法来删除特定的节点。在移除节点时,此方法将移除所有属于所移除的节点的子树节点;

如果要从DOM中移除多个节点,可以使用RemoveAll方法移除当前节点的所有子级节点和属性;

如果使用XmlNamedNodeMap,则可以使用RemoveNamedItem方法移除节点。

2. 删除属性集合中的属性

通常使用XmlAttributeCollection.Remove方法来删除特定属性;

可使用XmlAttributeCollection.RemoveAll来删除集合中的所有属性;

可使用XmlAttributeCollection.RemoveAt方法移除属性集合中的属性。

3. 删除节点属性

使用XmlElement.RemoveAttribute删除集合中特定名称的单个属性;

使用XmlElement.RemoveAllAttribute删除整个属性集合;

使用XmlElement.RemoveAttributeAt按索引号删除集合中的单个属性。

4. 删除节点内容

使用DeleteData方法删除字符,此方法从节点中移除某个范围的字符。如果要完全移除内容,则移除包含此内容的节点;如果要保留节点,但节点内容不正确,则修改内容。

七. 保存XML文档

可以使用Save方法保存XML文档。Save方法有如下四种重载方法:

  • (1)Save(string fileName):将文档保存到文件fileName的位置;
  • (2)Save(System.IO.Stream.outStream):保存到流outStream中,流的概念存在于文件操作中;
  • (3)Save(System.IO.TextWriter writer):保存到TextWriter中,TextWriter也是文件操作中的一个类;
  • (4)Save(XmlWriter w):保存到XmlWriter中。

八. 使用XPath导航选择节点

使用XPath导航可以查询DOM中的信息。

DOM类提供了两种XPath选择方法:

  • (1)SelectSingleNode:返回符合选择条件的第一个节点;
  • (2)SelectNodes:返回包含匹配节点的XmlNodeList。

实例:(在上述新建的fruit.xml中,查询出所有的item信息,并修改最后一个子节点内容)

XmlDocument doc = new XmlDocument(); // 创建DOM
doc.Load("fruit.xml"); // 把XML文档装入DOM
XmlNodeList nodeList; // 定义节点列表
nodeList root = doc.DocumentElement; // 定义根节点,并把DOM的根节点赋给它
nodeList = root.SelectNodes("//item"); // 查找product节点列表

// 循环访问节点列表,并做某些修改
foreach(XmlNode item in nodeList) {
    item.LastChild.InnerText = "green"; // 修改最后一个子节点内容
}

doc.Save("fruit.xml");

九. DataSet读取XML数据

DataSet对象可以使用GetXml()方法将数据导出为一个XML字符串,使用GetXmlSchema方法将数据的组织模式导出为一个XML Schema字符串。

例如:

DataSet dataSet = new DataSet();

string xmlString = dataSet.GetXml(); // 导出数据为XML格式
string xmlSchema = dataSet.GetXmlSchema(); // 导出数据的组织形式

另外,DataSet还可以使用方法WriteXml和WriteXmlSchema,把DataSet对象中的数据和Schema以XML的形式写出。例如:

using System.IO;

DataSet dataSet = new DataSet();

// 执行一些操作为DataSet对象填充数据,此处省略
// ...

FileStream fs = new FileStream("fruit.xml", System.IO.FileMode.Create);
dataSet.WriteXml(fs);
fs.Close();


// 写出数据组织形式
DataSet dataSet = new DataSet();

// 执行一些操作为DataSet对象填充数据,此处省略
// ...

FileStream fs2 = new FileStream("fruit2.xml", FileMode.Create);
dataSet.WriteXmlSchema(fs2);
fs2.Close();

十. XML填充DataSet

通过DataSet对象中的ReadXmlSchema方法,可以利用已存在的XML Schema来建立数据模式。ReadXmlSchema方法包含如下四种重载方法:

(1)ReadXmlSchema(string fileName):从指定的文件读取XML Schema;

  • (2)ReadXmlSchema(System.IO.Stream.outStream):从流中读取XML Schema;
  • (3)ReadXmlSchema(System.IO.TextReader reader):读取存在于TextReader的XML Schema;
  • (4)ReadXmlSchema(XmlReader reader):读取存在于XmlReader的XML Schema。

实例:

// 使用文件名
DataSet dataSet = new DataSet();
dataSet.ReadXmlSchema(Server.MapPath("fruit.xml"));
using System.IO;

// 使用流对象
DataSet dataSet = new DataSet();
FileStream fs = new FileStream("fruit.xml", FileMode.Open);
dataSet.ReadXmlSchema(fs);
using System.IO;
using System.Xml;

// 使用TextReader
DataSet dataSet = new DataSet();
FileStream fs = new FileStream("fruit.xml", FileMode.Open);
XmlTextReader xmlReader = new XmlTextReader(fs);
dataSet.ReadXmlSchema(xmlReader);
xmlReader.Close();
using System.IO;

// 使用XmlReader
DataSet dataSet = new DataSet();
StreamReader streamReader = new StreamReader(Server.MapPath("fruit.xml"));
dataSet.ReadXmlSchema(streamReader);
本文作者:子匠_Zijor,转载请注明出处:http://www.dengzhr.com/others/backend/csharp/657