C#中使用XML——实现DOM

在前两篇文章中我们讨论了 XML 文件的读取和写入,但都是基于流模型的解决方案,今天我们就来谈谈在 C# 中如何实现 DOM , DOM 确实有它的不足,但在编程工作中它还是不可或缺的技术。下面我们来简单了解一下 DOM 的相关知识。

DOM 的全称是 Document Object Model (文档对象模型),它是来自 W 3C 的官方标准,它允许按照 W 3C 标准 W 3C DOM Level1 和 W 3C DOM Level2 的规范所定义的规则,通过编程来读取,操纵和修改 XML 文档。 DOM 的工作方式是:首先将 XML 文档一次性的装入内存,然后根据文档中定义的元素和属性在内存中创建一个“树型结构”也就是一个文档对象模型,这里的含义其实是把文档对象化,文档中每个节点对应着模型中一个对象,而我们都知道对象提供编程接口,所以在 Application 中我们正是使用这组对象来访问 XML 文档进而操作 XML 文档,下图阐述了 Application 和 DOM 交互的过程:

DOM 既然是在内存中创建树型结构视图进而提供编程接口,那我们就以下面这个 XML 片段来说明 DOM 是如何创建树型结构的:

1<parent>
2<child 123”="" id="”">text here</child>
3</parent>

如果用 DOM 加载以上文档,它将在内存中创建的树型结构如下图:

DOM 的关键在于它允许直接更新内存中的树型结构,而不必重定向到其他输出,因此,添加、更新或删除结构中信息的操作效率更高。而作为程序员的我们重要的是要了解 DOM 所提供的编程接口以实现对 XML 文档进行操作,事实上, .NET Framework 定义了一组类用于反映 DOM 的体系结构,下面来看一下 .NET DOM 的继承结构:

在上图中所有弧角矩形中所包含的类描述了所有可能在 XML 文档中出现的节点类型,而操作 XML 文档不外乎是操作其中的节点,这些类又都是从 XmlNode 类派生而来,所以我们今天的主题是讨论 XmlNode 类和它的子类 XmlDocument ,下面对这些类做简单的介绍:

** XmlNode ** ** 类: **

该类是 DOM 中所有其他节点的抽象基类,它定义所有在更低级的类中继承或重写的成员。它表示 XML 文档中的单一节点,它提供了用于导航 DOM 树型结构的基本方法和属性,使用 XmlNodeType 枚举器可以枚举其下的所有节点类型。以下介绍该类的部分属性和方法:

属性:

[C#]

public virtual bool HasChildNodes {get;} ** ** 获取一个值,该值指示当前节点是否有任何子节点

public virtual XmlNodeList ChildNodes {get;} ** ** 获取当前节点的所有子节点

public virtual XmlNode FirstChild {get;} ** ** 获取当前节点的第一个子级

public virtual XmlNode LastChild {get;} ** ** 获取当前节点的最后一个子级

public virtual XmlNode ParentNode {get;} ** ** 获取当前节点的父级

public virtual XmlNode NextSibling {get;} ** ** 获取当前节点的下一个兄弟节点

public virtual XmlNode PreviousSibling {get;} ** ** 获取当前节点的上一个兄弟节点

public virtual string InnerText {get; set;} ** ** 获取或设置当前节点及其所有子节点的文本内容的串联值

public virtual string InnerXml {get; set;} ** ** 获取或设置仅代表当前节点的子节点的标记

public virtual string OuterXml {get;} ** ** 获取表示当前节点及其所有子节点的标记

方法:

public XmlNodeList SelectNodes(string); 选择文档中匹配 XPath 表达式的节点列表

public XmlNode SelectSingleNode(string); 选择文档中匹配 XPath 表达式的第一个 XmlNode

public virtual **** XmlNode **** AppendChild( XmlNode **** _ newChild _ ) 将指定的节点添加到该节点的子节点列表的末尾

public virtual **** XmlNode **** PrependChild ( XmlNode **** _ _ newChild _ _ _ ) _ 将指定的节点添加到该节点的子节点列表的开头

public virtual XmlNode RemoveChild(XmlNode oldChild) 移除指定的子节点

public virtual XmlNode ReplaceChild(XmlNode newChild,XmlNode oldChild) 用 _ newChild _ 节点替换子节点 _ oldChild _

** XmlNodeList ** ** 类: **

该类表示 XmlNode 的有序集合,它有以下常用成员:

Count ——以整数形式返回 XmlNodeList 中的节点数

ItemOf ——搜索在指定索引处的节点

GetEnumerator() ——提供迭代遍历节点列表的 foreach 样式

Item() ——返回参数指定的索引处的节点

** XmlDocument ** ** 类: **

** ** XmlDocument 类是 XML 文档的 .NET 表示形式,它代表了内存中树型结构的文档节点(所有的节点都在文档节点下), XmlDocument 类包含所有的 CreateXXX() 方法,这些方法允许创建所有派生自 XmlNode 的类型的节点,通常将该类与 XmlNode 类一起使用以完成对文档的操作,该类有一个 Load ()方法用于加载 XML 文档,该方法的一个重载版本允许从 XmlTextReader 加载文档,这给我们带来的好处是在操作较大的文档时我们可以先使用 XmlTextReader 过滤不相关的文档部分,这样即解决了 DOM 所带来的资源损耗问题又可以保留 DOM 对文档操控的便利性,该类的 Save ()方法用于保存文档。

接下来用一个简单的例子来说明在 C# 中如何实现 DOM ,照旧看代码前先看下运行效果图:

LoadXML 按纽用于加载 XML 文档, LoadXMLReader 按纽使用 XmlTextReader 加载文档, SaveXML 按纽保存文档, SaveXMLWriter 按纽将文档保存到 XmlTextWriter 中, Add Product 按纽添加节点, Replace Product 按纽替换节点, Change Order 按纽修改文档, Remove Product Info 按纽移除节点。

DomOperation 类封装了所有按纽功能的实现,代码如下:

namespace DOMSamples

{

using System;

using System.Xml;

using System.Text;

using System.Windows.Forms;

using System.ComponentModel;

///

1<summary>
2
3///  DomOperation  提供对  Xml  文件操作的类 
4
5///  </summary>

///

1<remarks>
2
3///  该类用于提供对  XML  文件进行一般的操作,如(添加,删除,替换节点,加载,保存文件)等,该类内部实现采用  DOM  技术。 
4
5///  </remarks>

public class DomOperation : IDisposable

{

private string _xmlPath;

private XmlDocument xmlDoc;

#region DomOperation 构造器

///

1<summary>
2
3///  默认构造器,对该类成员进行默认赋值 
4
5///  </summary>

public DomOperation()

{

this ._xmlPath = string .Empty;

this .xmlDoc = null ;

}

///

1<summary>
2
3///  带参构造器,对该类成员进行初始赋值 
4
5///  </summary>

///

1<param name="xmlPath"/>

xml 文件路径

public DomOperation( string xmlPath)

{

this ._xmlPath = xmlPath;

this .xmlDoc = null ;

}

#endregion

#region DomOperation 资源释放方法

///

1<summary>
2
3///  清理该对象所有正在使用的资源 
4
5///  </summary>

public void Dispose()

{

Published At
Categories with Web编程
Tagged with
comments powered by Disqus