Visual C#中使用XML之实现DOM

2016-02-19 15:07 12 1 收藏

下面图老师小编要向大家介绍下Visual C#中使用XML之实现DOM,看起来复杂实则是简单的,掌握好技巧就OK,喜欢就赶紧收藏起来吧!

【 tulaoshi.com - 编程语言 】

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

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

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

  

<parent><child id=123>text here</child></parent>

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

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  在上图中所有弧角矩形中所包含的类描述了所有可能在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;} 获取表示当前节点及其所有子节点的标记

  方法:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  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类封装了所有按纽功能的实现

来源:http://www.tulaoshi.com/n/20160219/1608907.html

延伸阅读
    我感觉声音的播放比较简单。我们从播放声音开始。为什么我这么觉得?我也不知道。 这里是展示最最最最最简单的DirectX播放声音的例子,我尽量省略了无关的代码。最后的代码只有19行,够简单了吧? 准备工作: 1.安装了DirectX SDK(有9个DLL文件)。这里我们只用到MicroSoft.DirectX.dll 和 Microsoft.Directx.DirectSound...
可能大家都知道dataview这个名词的概念,但也许不是很多人可以说清楚在.net架构中它的应用范围和程度。比如:究竟datagrid和repeater这些控件是如何和数据关联起来的?很多人会告诉我是通过dataset。这显然是正确的,但究竟最根本最直接的是通过什么联系起来的呢? 答案就是dataview。其实下面的语句: DatagridTC.DataSource ...
ICMP就是所谓的Internet控制报文协议(Internet Control Message Protocol),在网络中,一般用它来传递差错报文以及其他应注意的信息。ICMP一般被认为是和IP协议同一层的协议,IMCP报文通常被IP层或者更高层的协议(如:TCP或者UDP)使用,ICMP对于互联网以及其他基于IP协议的网络的正常运行起着非常重要的作用。有许多重要的网络程序都是...
       在我们的开发项目中使用MVC(Model-View-Control)模式的益处是,可以完全降低业务层和应用表示层的相互影响。此外, 我们会有完全独立的对象来操作表示层。MVC在我们项目中提供的这种对象和层之间的独立,将使我们的维护变得更简单使 我们的代码重用变得很容易(下面你将看到)。 ...
管道技术一般采用Window API来实现,最近我试着用C#来实现Windows管道技术,发现C#本身方便的进程线程机制使工作变得简单至极,随手记录一下,推荐给大家。 首先,我们可以通过设置Process类,获取输出接口,代码如下: Process proc = new Process();proc .StartInfo.FileName = strScript;proc .StartInfo.WorkingDirectory =...

经验教程

953

收藏

94
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部