XmlNode与XmlElement的区别(转)

原文:http://www.uipower.com/bbs/thread-98568-1-1.html

今天在做ASP.NET操作XML文档的过程中,发现了两个类:XmlNode和XmlElement。这两个类的功能极其类似(因为我们一般都是在对Element节点进行操作)。上网搜罗了半天,千篇一律的答案。永远说不到重点,有些人回答又特别含糊,无奈之下,自己设断点尝试对比效果,现在总结如下:
1、通过继承关系XmlElement继承自XmlLinkedNode又继承自XmlNode类,由此可知XmlElement是XmlNode的子类。我们知道子类继承了父类所有的属性和方法,因此,XmlNode所拥有的方法和属性,在XmlElement类中也是可以使用的。
2、XmlElement是特殊的XmlNode类,Xml节点有多种类型:属性节点、注释节点、文本节点、元素节点等。也就是XmlNode是这多种节点的统称。但是XmlElement专门指的就是元素节点。
3、XmlElement是具现类,可以直接实例化,而XmlNode是抽象类,必须通过XmlDocument实例通过CreateNode创建。
4、XmlElement拥有众多对Attribute的操作方法,可以方便的对其属性进行读写操作(XmlNode也可以通过Attributes属性获取属性列表)。
5、在网上看到有人这么评论这两个类的区别:XmlNode包含子节点,XmlElement只包含属性及其本身不含有子节点。但是我通过代码测试,发现即使是XmlElement,也可以通过ChildNodes来获取子节点列表。虽然在断点中断模式下,我并没有发现XmlElement有ChildNodes属性。

XmlElement是XmlNode的一部分,不是互换。
如果用XmlNode换XmlElement是可以的,但是如果
用XmlElement换XmlNode可能会发生错误,因为XmlNode不止包含XmlElement.

这是比较准确的,至于为什么这样说,我们现在看下他们之间的继承层级关系:

 XmlNode与XmlElement的区别总结 - 一切皆有可能 - 一切皆有可能

我们可以发现,XmlElement继承自XmlNode,根据继承观点:

备注:派生类对基类成员的访问

派生类可以访问基类的公共成员、受保护成员、内部成员和受保护内部成员。即使派生类继承基类的私有成员,仍不能访问这些成员。但是,所有这些私有成员在派生类中仍然存在,且执行与基类自身中相同的工作。例如,假定一个受保护基类方法访问私有字段。要使继承的基类方法正常工作,派生类中必须有该字段。 因此被派生类具有更多派生类的成员。

常用的代码:

<a b="1">  
     <c d="1">1</c>  
</a> 

XmlNode a;  
string   s   =   a.Attributes["b"].Value;  
   
XmlElement   a;  
string   s   =   a.GetAttribute("b");

 

Element是Node的子集,XmlNode表示一个节点,包括XmlElement(元素)和XmlAttribute(属性)等。 如:


<Alarm lock="true">             //node  
      <Time>                       //node  
          StringValue              //node  
      </Time>                      //node  
</Alarm>                           //node 

 

  以上Alarm(元素节点),lock(属性节点),Time(元素节点),StringValue(文本节点)都是Node,但是只有 <Alarm>......</Alarm>和<Time>StringValue</Time>是Element 

posted @ 2012-12-18 15:32  LiGang  阅读(291)  评论(0编辑  收藏  举报