一.DOM简介
1.什么是DOM
XML:XML是一种跨语言,跨平台的数据存储格式,可以在任何两个应用程序间共享数据,这两个程序可能使用不同的语言编写,由不同的公司构建,运行在不同的操作系统上.
XML本身是一个文本文件,用于存储数据的,有人把XML当成小型数据库来使用.
DOM:Document Object Model简称为DOM,用W3C的话说,DOM是一种允许程序或脚本动态地访问更新文档内容,结构和样式的,独立于平台和语言的规范化接口.
通俗的说,DOM就是一种规范.
DOM的规范级别:
1.DOM级别1(Level 1)
DOM级别1于1998年10月1日成为W3C推荐标准.专注于HTML和XML文档模型.它含有文档导航和处理功能.
2.DOM级别2(Level 2)
DOM级别2规范发布于2000年11月13日.DOM级别2对DOM级别1添加了样式表对象模型,并定义了操作附于文档之上的样式信息的功能性.DOM级别2同时还定义了一个事件模型,并提供了对XML命名空间的支持.
3.DOM级别3(Level 3)
DOM级别3规定了内容模型(DTD和Schemas)和文档验证.同时规定了文档加载和保存,文档查看,文档格式化和关键事件.DOM级别3建立于DOM级别2之上.
2.DOM的作用和地位
DOM的作用:DOM为编程语言提供一组与平台无关的类和接口(API),编程者可以使用DOM中的API来对XML进行增,删,改,查的操作.
DOM的地位:DOM处在编程语言和XML文件之间.
3.DOM模型
使用DOM来解析XML文档,首先DOM解析器会把XML加载到内存,XML文件在内存中以对象树的形式存在,这个对象树模型就是DOM模型.
使用ODM来解析XML文档时,XML中所有的信息在对象树中以树节点(Node)的形式存在.
DOM树中的节点类型主要有五种:
1.元素节点(Element):XML中的元素在DOM树中成为元素节点,节点类型(NodeType)为1;
2.属性节点(Attribute):XML中的属性在DOM树中成为属性节点,节点类型(NodeType)为2;
3.文本节点(Text):XML中的文本在DOM树中成为文本节点,节点类型(NodeType)为3;
4.注释节点(Comments):XML中的注释在DOM树中成为注释节点,节点类型(NodeType)为8;
5.文档节点(Docment):是DOM树的根节点,节点类型(NodeType)为9;
二. .NET中的DOM常用对象
在.NET的System.Xml命名空间中包含了操作XML的类和接口,其中基于DOM操作XML的核心类如表所示:
类名 | 说明 |
XmlDocument | 表示一个XML文档 |
XmlNode | 表示XML文档中的单个节点 |
XmlNodeList | 表示排序的节点集合 |
XmlElement | 表示一个元素 |
XmlAttribute | 表示一个属性 |
XmlAttributeCollection | 表示元素节点的属性集合 |
XmlText | 表示元素或属性的文本内容 |
1.XmlNode类
XmlNode是DOM最关键的一个类,它的实例表示一个DOM树中的一个节点.XmlNode类没有公共构造函数,这表示不能用new关键字创建XmlNode的实例.
1)属性
属性 | 说明 |
Attributes |
如果节点的类型是XmlNodeType.Element,该属性就返回包含元素特性的XmlAttributeCollection(派生于XmlNamedNodeMap),否则返回null. |
ChildNodes | 获取节点中所有子节点的XmlNodeList.如果该节点没有子节点,该属性就返回一个空列表. |
FirstChild | 获取一个XmlNode,表示当前节点的第一个子节点.如果该节点没有子节点,就返回一个null. |
HasChildNode | 获取一个布尔值,表示该节点是否有子节点.如果有子节点,该布尔值就是true,否则就是false. |
InnerText | 表示一个字符串,其值把当前节点及其所有子节点的文本内容连接起来. |
InnerXml | 获取或设置当前节点的子内容标记. |
LastChild | 获取一个XmlNode实例,表示当前节点的最后一个子节点,如果没有这样的节点,就返回一个空引用. |
Name | 当在派生类中被重写时,对不同的节点类型以字符串形式返回节点的限定名称. |
NextSibling | 该属性返回XmlNode实例,它表示按照文档顺序与当前节点同级(即有相同的深度)的下一节点.如果不存在这样的节点,就返回一个空引用. |
NodeType | 当在派生类中被重写时,获取当前节点的类型,返回一个XmlNodeType值. |
OuterXml | 这个字符串属性递归获取当前节点及其所有子节点的XML标记. |
OwnerDocument | 获取节点所属的XmlDocument实例.如果节点本身是一个文档,该属性就是null. |
ParentNode |
获取XmlNode的父节点,如果没有就返回null. |
PreviousSibling | 获取与当前节点深度相同的前一个XmlNode,如果没有就返回null. |
Value | 获取或设置节点的值. |
2)方法
方法 | 用法 |
AppendChild | 带一个XmlNode类型的参数(或其派生类型),该方法把参数添加到当前节点的子节点列表的末尾.返回值是所添加的节点. |
Clone | 对节点执行深复制(即包含所有的派生节点和属性).该方法没有参数,返回XmlNode副本,等价于CloneNode(true). |
CloneNode | 这是一个抽象方法,它复制当前节点. |
InsertAfter | 在给定引用节点的子节点列表中,在该引用节点的后面插入一个节点.该方法带两个XmlNode类型的参数:一个是要添加的子节点,另一个是引用节点. |
InsertBefore | 与InsertAfter类型,但新节点在引用节点的前面插入(除非引用节点为null,此时节点添加到子节点列表的最后). |
PrependChild | 把一个节点添加到该节点的子节点列表的开头. |
RemoveAll | 删除调用节点的所有子节点和/或特性. |
RemoveChild | 删除指定的子节点,该方法带一个XmlNode类型的参数,删除成功就返回该节点. |
ReplaceChild | 用一个新节点代替一个子节点,返回旧(被替换的)节点. |
2.XmlDocument类
XmlDocument类派生自XmlNode类.其实例表示一个Xml文档对象.XmlDocument类有许多用途.它不仅可以执行DOM模型中所有外围结构的接口,还可以创建新节点.
1)属性
属性 | 说明 |
DocumentElement(只读) | 返回组成DOM树中根的XmlElement. |
DocumentType(只读) | 把DOCTYPE声明(如果有)返回一个XmlDocumentType对象 |
PreserveWhitespace |
这个布尔属性控制着在执行Load,LoadXml和Save过程中是否保留空白. 如果在执行这些操作中的任何一个之前,该布尔属性是true,就保留空白. |
2)方法
方法 | 说明 |
CreateAttribute | 用给定的名称创建一个XmlAttribute节点. |
CreateElement | 创建一个XmlElement节点. |
CreateNode | 根据给出的类型,名称和命名空间信息,创建并返回一个XmlNode. |
CreateTextNode | 根据一个包含新节点中文本内容的字符串,创建并返回一个XmlText节点. |
CreateXmlDeclaration | 根据下面的参数创建一个XmlDeclaration节点. |
GetElementById | 返回一个匹配给定字符串ID参数的XmlElement. |
GetElementByTagName | 返回一个XmlNodeList,其中包含其名称匹配给定名称的所有子元素. |
Load | 加载一个XML文档,并解析它. |
LoadXml | 从字符串中加载XML文档.这个字符串参数由文档标记组成. |
Save | 把XML文档写到给定的位置上. |
3.XmlNodeList类
XMLNodeList是一个节点集合类,其元素为XmlNode类型.XmlNodeList没有公共构造函数,因此不能创建和删除XmlNodeList类的实例.获得XmlNodeList实例最常用的方式是引用XmlNode的ChildNodes属性.
1)属性
属性 | 说明 |
Count | 获取XmlNodeList中的节点数 |
ItemOf(只读) | 检索给定索引处的节点 |
方法 | 用法 |
GetEnumerator | 该方法没有参数,返回一个IEnumerator实例.以支持在列表上执行foreach迭代. |
Item | 该方法带一个基于0的整数索引参数,返回列表中该索引所在位置的XmlNode.如果索引超出列表的范围,该方法就返回null. |
属性 | 说明 |
Attributes | 获取一个XmlAttributeCollection,其中包含该元素节点的所有属性. |
ClildNodes | 获取元素节点的所有子节点.(继承自XmlNode). |
HasAttributes | 获取一个boolean值,该值指示当前元素节点是否有任何属性. |
HasChildNodes | 获取一个值,该值指示节点是否有任何子节点.(继承自XmlNode). |
InnerText | 获取或设置节点及其所有子级的串连值.(重写XmlNode.InnerText). |
InnerXml | 获取或设置只表示此节点子级的标记.(重写XmlNode.InnerXml). |
IsEmpty |
获取或设置一个布尔值.当该值为true时,元素就是空的,并以<name />缩写形式表示.如果元素是子内容或以完整形式<name><name/>表示, 则该属性返回false.如果这个属性设置为true,就删除它的所有子内容,因为这将指定该元素应为空. |
LastChild | 获取元素节点的最后一个子级.(继承自XmlNode). |
Name | 获取元素节点的限定名.(重写XmlNode.Name). |
NextSibling | 获取这个元素节点后面的XmlNode,如果不存在这样的节点,该属性就返回null. |
NodeType | 获取当前元素节点的类型.(重写XmlNode.NodeTye).返回XmlNodeType.Element. |
OwnerDocument | 获取该元素节点所属的XmlDocument(重写XmlNode.OwnerDocument). |
PreviousSibling | 获取紧接在该元素节点之前的节点.(继承自XmlLinkedNode). |
Value | 获取或设置元素节点的值.(继承自XmlNode). |
方法 | 说明 |
AppendChild | 将指定的节点添加到该节点的子节点列表的末尾.(继承自XmlNode). |
CloneNode |
复制属性,并把副本返回为一个XmlNode实例.该方法带一个布尔参数(该参数为true时,会递归复制子内容,进行深复制, 该参数为false时,则仅复制元素). |
GetAttribute | 返回指定属性的属性值. |
GetAttributeNode | 与GetAttribute类似(包括重载的参数列表),但如果找到匹配,返回类型是XmlAttribute,如果没有找到匹配,则返回null. |
GetElementsByTagName | 返回一个XmlNodeList,它包含与指定名称匹配的所有子代元素的列表. |
HasAttribute | 确定当前节点是否具有指定的属性. |
RemoveAll | 移除当前节点的所有指定属性和子级.不移除默认属性.(重写XmlNode.RemoveAll()). |
RemoveAttribute | 移除指定的属性. |
RemoveAttributeAt | 从元素中移除具有指定索引的属性节点. |
RemoveAttributeNode | 从元素中删除并返回XmlAttribute. |
RemoveChild | 移除指定的子节点.(继承自XmlNode). |
ReplaceChild | 用newChild节点替换子节点oldChild.(继承自XmlNode). |
SetAttribute | 设置指定属性的值. |
SetAttributeNode | 添加一个新XmlAttribute. |
5.XmlAttribute类
XmlAttribute是System.Xml命名空间中最常用的DOM类之一.它也直接派生自XmlNode,是唯一适合于表示XML属性的类.
1)属性
属性 | 含义 |
Name | 把属性节点的限定名称返回为一个字符串. |
NodeType | 获取一个XmlNodeType枚举,其值为XmlNodeType.Attribute. |
NextSibling | 获取紧接在该节点之后的节点.(继承自XmlNode). |
OwnerDocument | 获取这个特性所属的XmlDocument. |
OwnerElement | 获取该属性所属的XmlElement. |
PreviousSibling | 获取紧接在该属性节点之前的节点.(继承自XmlNode). |
Value | 获取或设置节点的值.(重写XmlNode.Value). |
2)方法
XmlAttribute类的Clone()方法可以创建此属性节点的一个副本.
6.XmlAttributeCollection类
XmlAttributeCollection表示可以按名称或索引访问的属性的集合,其元素为XmlAttribute类型.该类派生自XmlNameNodeMap类.
1)属性
这个类的最常用的属性是Count.这是一个只读整数属性,用于获取集合所包含的XmlAttribute节点数.
2)方法
方法 | 说明 |
Append | 将指定的属性插入集合,并将其作为集合中的最后一个节点. |
GetEnumerator | 提供一个IEnumerator实例,以支持在映射内容上执行foreach的枚举. |
InsertAfter | 将指定属性直接插入到指定引用属性之后. |
InsertBefore | 将指定属性直接插入到指定引用属性之前. |
Item | 检索位于XmlNamedNodeMap中指定索引处的节点.(继承自XmlNamedNodeMap). |
Prepend | 将指定属性插入集合中,并将其作为集合的第一个节点. |
Remove | 从集合中移除指定的属性. |
RemoveAll | 从集合中移除所有属性. |
RemoveAt | 从集合中移除与指定的索引对应的属性. |
RemoveNamedItem | 从映射中删除指定的节点,该方法有两个重载形式,它们分别匹配GetNamedItem的两个不同版本. |
SetNamedItem |
在集合中插入所提供的XmlNode实例.如果传送过来的节点已经在映射中(就是修改节点的内容), 就返回旧(被替代的)节点.如果节点是新的,就返回null. |
7.XmlText类
XmlText表示元素节点或属性节点的文本内容.该类没有构造方法,但可以使用XmlNode的CreateTextNode()方法得到实例.
1)属性
XmlText的Length属性可以获取数据的长度(以字符为单位).(从XmlCharacterData继承).XmlText的Value属性用于得到文本节点的位置.