XmlNode与XmlElement的区别总结
XmlNode与XmlElement的区别总结
今天在做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类提供了⼀系列⽅法来对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:获取或指定当前元素的值aspnet和net的区别
应⽤:XML 元素的添加、修改和删除
利⽤XmlElement 类提供的对元素结构描述和操作的功能,可以⽅便地对XML 数据中的元素进⾏操作,包括元素的添加,以及删除和修改其内容。XmlElement 类的主要特征是关于元素本⾝属性的⼀系列属性和⽅法。
1、编写⼀个XML ⽂件,命名为“l”,
并保存到指定的路径中。内容如下:
genre="novel" publicaiondate="1997"
isbn="1-86001-57-5">  <title>Pride And
<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 ⽅法中编写主程序,代码如下:  XmlDocument doc = new XmlDocument();  doc.Load(@"C:\l ");  XmlElement root = doc.DocumentElement;  //创建并
添加
XmlElement 实例到XmlDocument 类实例中
XmlElement elm =
doc.CreateElement("Aut
hor");
elm.InnerText ="Jane";
root.SelectSingleNode("/
store/book[@id=1]").App
endChild(elm);
Console.WriteLine(elm.P
arentNode.InnerXml);
/
/修改XmlElement 类实
例的属性
XmlElement newelm =
doc.CreateElement("Aut
hor");
XmlAttribute attr =
doc.CreateAttribute("first
name");
attr.Value = "Jane";
newelm.SetAttributeNod
e(attr);
root.SelectSingleNode("/
store/book[@id=1]").Repl
aceChild(newelm,elm);
Console.WriteLine(newel
m.ParentNode.InnerXml);
//删除XmlElement 类实
例这只是我个⼈试验后的戳见,有不对的地⽅,或者是有需要补充的地⽅希望前辈们指正。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。