原文链接:http://www.cnblogs.com/oilsun/archive/2012/07/07/2580427.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属性。举例如下:
//是XmlNode也是XmlElement,但是img以及aspnet.jpg只是XmlNode
       //既是XmlNode 也是XmlElement    
           C#      //只是XmlNode

也就是元素节点可以相应转换为XmlElement,这样既可以使用XmlNode的功能,也可以使用它特有的对属性的操作方法。
任意节点都可以使用XmlNode,因为XmlNode是所有Node的父类。

管理XML元素的类:XmlElement类

XmlElement类表示DOM结构中的元素。元素是DOM结构中最常见的节点。该类型继承于XMLNode类的子类XmlLinkNode类, 继承了XmlNode的特点,同时还提供了XML数据中针对于元素的一些方法和属性,以便更好地反映元素节点的特征,以及更便捷地操作元素。

该类除继承XmlNode的特征以外,最重要的特征,和其他XmlNode类派生类不同的地方就是其元素拥有自己的属性集合。XmlElement 类为此提供了多种对于属性的访问手段。例如:可以使用GetAttribute方法获取指定的属性,可以使用SetAttribute设置指定的属性,可 以使用RemoveAttribute移除指定的属性,可以使用GetAttributeNode获取属性节点,还可以直接通过访问该类的 Attribute属性获得元素的属性列表——该列表支持索引值和名称两种访问指定属性的手段。

语法定义:

public class XmlElement : XmlLinkedNode

因为XmlElement类的构造函数是受保护的,所以不能使用其创建XmlElement类的实例。一般采用的做法是在XmlDocument类 实例中,使用CreateElement方法创建XmlElement类的实例。下面的代码演示了使用不同的方法建立XmlElement的实例:

//使用指定的名称创建XmlElement类的实例
XmlElement elm = new XmlDocument().CreateElement("newelement"); //使用元素的限定名和元素命名空间URL创建XmlElement类的实例
XmlElement elm = new XmlDocument().CreateElement("abc:code","urlname:newelm"); //使用元素前缀、元素本地名称和元素命名空间URL创建XmlElement类的实例
XmlElement elm = new XmlDocument().CreateElement("xy","item","urlname:abc");

方法:

XmlElement类提供了一系列方法来对XML文档对象进行操作。主要方法如下:

AppendChild:将指定的节点添加到当前元素的子节点列表的末尾

Clone:克隆当前元素实例

CloneNode:克隆当前元素实例,该方法与Clone方法的区别在于,CloneNode能够通过指定bool deep参数的值,来决定是否克隆当前元素的子节点。

CreateNavigator:创建浏览当期元素的XpathNavigator

GeAttribute:获取当前元素的指定属性的属性值

GetAttributeNode:获取当前元素指定的属性节点

GetElementsByTagName:包含指定名称元素所有子节点的列表

HasAttribute:获取指示当前节点是否具有指定的属性值

InsertAfter:在指定元素之后插入节点

InsertBefore:在指定元素之前插入节点

PrependChild:在指定元素的子节点列表开头添加节点

RemoveAll:移除除了默认属性以外当前元素的所有指定属性的子节点

RemoveAllAttributes:移除除了默认属性以外的所有属性

RemoveAttribute:移除指定的属性

RemoveAttributeAt:从元素中移除指定位置的属性

RemoveAttributeNode:移除指定的XmlAttribute节点

RemoveChild:从节点列表中删除指定的子节点

ReplaceChild:使用新的节点替换原有的节点

SelectNodes:根据XPath表达式,获得符合条件的节点列表

SelectSingleNode:根据XPath表达式,获得符合条件的第一个节点

SetAttribute:指定属性的值

SetAttributeNode:向当前元素添加属性

WriteContentTo:使用指定的XmlWriter类实例保存当前元素的所有子节点

WriteTo:使用指定的XmlWriter保存当前元素

属性详解:

Attitudes:获取包含当前元素属性的列表

BaseURI:获取当前元素的基URI

ChildNodes:获取当前元素的所有子节点

FirstChild:获取当前元素的第一个子节点

HasAttributes:获取指示当前元素是否有任何属性值

HasChildNodes:获取指示当前元素是否有任何子节点的值

InnerText : 获取或指定当前元素及其所有子节点的串联值

InnerXml:获取或指定包含当前元素内所有子节点的、包含结构标志的XML文本

IsEmpty:获取或指定元素是否以短标记格式序列化元素的值

IsReadOnly:获取指示当前元素是否是只读的值

Item:获取当前元素指定的子元素

LastChild:获取当前元素的最后一个子节点

LocalName:获取当前元素的本地名称

Name:获取当前元素的限定名

NamespaceUri:获取当前元素的命名空间URI

NextSibling : 获取紧接在当前元素后一个同级节点

NodeType:获取当前元素的节点类型

OuterXml:获取表示当前元素及其所有子节点的XML文本

OwnerDocument:获取当前元素所属的XmlDocument

ParentNode:获取当前节点的父节点

Prefix:获取或指定当前元素的命名空间前缀

PreviousSibling:获取紧接当前元素的前一个同级节点

Value:获取或指定当前元素的值

应用:XML元素的添加、修改和删除

利用XmlElement类提供的对元素结构描述和操作的功能,可以方便地对XML数据中的元素进行操作,包括元素的添加,以及删除和修改其内容。XmlElement类的主要特征是关于元素本身属性的一系列属性和方法。

1、编写一个XML文件,命名为“Book.xml”,并保存到指定的路径中。内容如下:

<?xml version="1.0"?>
<store>
<book id="1" genre="novel" publicaiondate="1997" isbn="1-86001-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 Manager</title>
<price>31.44</price>
</book> </store>

2、新建一个Windows控制台应用程序,命名为"EditElement",在Main方法中编写主程序,代码如下:

static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\book.xml");
XmlElement root = doc.DocumentElement;
//创建并添加XmlElement实例到XmlDocument类实例中
XmlElement elm = doc.CreateElement("Author");
elm.InnerText ="Jane";
root.SelectSingleNode("/store/book[@id=1]").AppendChild(elm);
Console.WriteLine(elm.ParentNode.InnerXml);
//修改XmlElement类实例的属性
XmlElement newelm = doc.CreateElement("Author");
XmlAttribute attr = doc.CreateAttribute("firstname");
attr.Value = "Jane";
newelm.SetAttributeNode(attr);
root.SelectSingleNode("/store/book[@id=1]").ReplaceChild(newelm,elm);
Console.WriteLine(newelm.ParentNode.InnerXml);
//删除XmlElement类实例
root.SelectSingleNode("/store/book[@id=1]").RemoveChild(newelm);
Console.WriteLine(root.SelectSingleNode("/store/book[@id=1]").InnerXml);
Console.ReadLine();
}

XPath的学习: http://www.w3school.com.cn/xpath/

XmlNode与XmlElement的区别总结的更多相关文章

  1. XmlNode和XmlElement区别

    今天在做ASP.NET操作XML文档的过程中,发现了两个类:XmlNode和XmlElement.这两个类的功能极其类似(因为我们一般都是在对Element节点进行操作).上网搜罗了半天,千篇一律的答 ...

  2. 读取XML文件(XmlNode和XmlElement区别)

    XmlNode和XmlElement区别.这两个类的功能极其类似(因为我们一般都是在对Element节点进行操作). 1.通过继承关系XmlElement继承自XmlLinkedNode又继承自Xml ...

  3. 关于XML中:XmlNode和XmlElement的涵义及不同之处

    今天学习XML,遇到XmlNode和XmlElement俩个类,故有了下文的所述: 今天在做ASP.NET操作XML文档的过程中,发现了两个类:XmlNode和XmlElement.这两个类的功能极其 ...

  4. XML文件的操作说明

    说明:C#中XmlNode与XmlElement的区别如下:xmlnode类表示xml文档中的单个节点,其命名空间为:System.Xml.XmlNode的三个最主要的子类包括:XmlDocument ...

  5. 11 数据存储(Unity3D)

    所有的游戏开发都离不开数据存储的操作,Unity3D也不例外PlayerPrefs:PlayerPrefs是Unity系统自带的的一种最简单的存储方式,数据是使用字典的方法来存储的 PlayerPre ...

  6. [转]XML中元素(Element)与节点(Node)的区别

    前言: element是特殊的node 一段纯文本即text-node也是node 但不是element w3c的原话是 A node can be an element node, an attri ...

  7. C# XML相关操作

    XML是一种意见单文本格式存储数据的方式,这意味着它可以被任何计算机读取.XML中完整的数据集就是XML文档. 在名称空间System.Xml下面大部分类型都是用来支持DOM处理模型的.其中很多类型配 ...

  8. xml 方式更新和获取 配置文件 appSettings 节点 解决办法

    最近在搞一个小程序,会用到动态修改配置文件来进行处理,在百度上找了很多办法,但是始终达不到我预想的效果,先列出程序运行环境和开发工具版本: 开发工具:VS2010 .Net 运行环境:4.0 有两种方 ...

  9. Winform读写App.config文件以及重启程序

    //重启主程序 //System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Locatio ...

随机推荐

  1. java中,为什么char类型数组可以直接用数组名打印,打印结果居然不是地址值!

    char类型的数组就相当于一个字符串. 因为输出流System.out是PrintStream对象,PrintStream有多个重载的println方法,其中一个就是public void print ...

  2. MFC拾遗

    c++处理文件,对txt进行处理,学了那么久才发现我还不会这些操作,另外c++处理文本真是快得可怕啊 #include <iostream> #include <fstream> ...

  3. Java面试题之多线程同步和互斥有几种实现方法,都是什么?

    线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另外一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒. 线程互斥是指对于共享的进程系统资源,每个线程访问时的排他 ...

  4. 【bzoj2216】[Poi2011]Lightning Conductor 1D1D动态规划优化

    Description 已知一个长度为n的序列a1,a2,…,an.对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p – sqrt(abs ...

  5. C# 实现图像快速 水平 垂直 翻转

    C#  图像水平,垂直翻转的方法,速度很快 重新把图像绘制成翻转的方法 /// <summary> /// 图像水平翻转 /// </summary> /// <para ...

  6. APUE 学习笔记(九) 高级I/O

    1. 非阻塞I/O 低速系统调用时可能会使进程永远阻塞的一类系统调用,包括以下调用: (1)某些文件类型你(网络socket套接字.终端设备.管道)暂无可使用数据,则读操作可能会使调用者永远阻塞 (2 ...

  7. c语言第二题

    在我们的业务中经常会遇到很多业务,字符串会有一系列的操作,请写出以下的方法 1.写一个函数,给定char *p,char q,判断char *p中是否包含char q这个字符,包含则返回这个字符的下标 ...

  8. vue2 父子组件间通信

    父组件往子组件传值 props 传text father.vue <template> <div class="father"> {{'我是父组件'}} & ...

  9. ListView更新方法的优化

    ListView和Adapter对象均具备有对象更新方法 ListView对象列表的更新方法1.invalidate();--重绘组件2.invlidateView()--重绘组件并包含所有的View ...

  10. Perl语言入门--2--perl的运算符

    一.算数运算符 **:是幂 结果不能超过数的范围 当指数为小数时 底数不能为负数 %:取余数  两边的操作数为整数,如果不是则要截取,把所有的小数部分去掉 注意:当一个字符串参加运算,需要转化为整数时 ...