XML 文档对象模型 (DOM) 类是 XML 文档的内存中表示形式。DOM 使您能够以编程方式读取、处理和修改 XML 文档。XmlReader 类也读取 XML,但它提供非缓存的只进、只读访问。这意味着使用 XmlReader 无法编辑属性值或元素内容,也无法插入和移除节点。编辑是 DOM 的主要功能。XML 数据在内存中表示是常见的结构化方法,尽管实际的 XML 数据在文件中时或从另一个对象传入时以线性方式存储。以下是 XML 数据。
输入
下图显示将此 XML 数据读入 DOM 结构中时如何构造内存。

在 XML 文档结构中,此图中的每个圆圈表示一个节点(称为 XmlNode 对象)。XmlNode 对象是 DOM 树中的基本对象。XmlDocument 类(扩展 XmlNode)支持用于对整个文档执行操作(例如,将文档加载到内存中或将 XML 保存到文件中)的方法。此外,XmlDocument 提供了查看和处理整个 XML 文档中的节点的方法。XmlNode 和 XmlDocument 都具有性能和可用性增强,并通过方法和属性执行下列操作:
-
访问和修改 DOM 特定的节点,如元素节点、实体引用节点等。
-
除检索节点包含的信息(如元素节点中的文本)外,还检索整个节点。
注意 如果应用程序不需要 DOM 提供的结构或编辑功能,则 XmlReader 和 XmlWriter 类提供对 XML 的非缓存的只进流访问。
DOM 的一个特性是处理属性的方式。属性是不属于父子关系和同辈关系的节点。属性被视为元素节点的属性,由名称和值对组成。例如,如果存在由与元素 price
关联的 format="dollar
" 组成的 XML 数据,则单词 format
是名称,format
属性的值是 dollar
。为检索 price 节点的 format="dollar"
属性,可以在游标位于 price
元素节点时调用 GetAttribute 方法。
将 XML 读入内存时会创建节点。然而,并非所有节点都是同一类型。XML 中的元素具有不同于处理指令的规则和语法。因此,在读取各种数据时,将为每个节点分配一种节点类型。此节点类型确定节点的特性和功能。
有关在内存中生成的节点类型的更多信息,请参见 XML 节点类型。有关在节点树中创建的对象的更多信息,请参见将对象层次结构映射到 XML 数据。
Microsoft 扩展了万维网联合会 (W3C) DOM 级别 1 和级别 2 中可用的 API,使 XML 文档的使用更容易。在完全支持 W3C 标准的同时,附加的类、方法和属性增加了使用 W3C XML DOM 无法完成的功能。新类使您能够访问关系数据,为您提供与 ADO.NET 数据同步、同时将数据作为 XML 公开的方法。有关更多信息,请参见使 DataSet 与 XmlDataDocument 同步。
在将 XML 数据读入内存,以更改其结构、添加或移除节点或者与在元素包含的文本中一样修改节点所保存的数据时,DOM 最有用。不过,在其他方案中,还有其他比 DOM 更快的类。要对 XML 进行快速非缓存只进流访问,请使用 XmlReader 和 XmlWriter。如果需要用游标模型和 XPath 进行随机访问,请使用 XPathNavigator 类。
访问 DOM 中的属性
属性是元素的属性,不是元素的子级。这一区别很重要,因为用来浏览 XML 文档对象模型 (DOM) 的同辈、父级和子节点的方法不同。例如,PreviousSibling 和 NextSibling 方法不用来从元素浏览到属性或在属性间浏览。属性是元素的属性,归元素所有,具有一个 OwnerElement 属性而非 parentNode 属性,并且具有不同的浏览方法。
当当前节点是元素时,请使用 HasAttribute 方法查看是否存在任何与此元素关联的属性。如果已知元素具有属性,有多种方法可以访问这些属性。要从元素中检索单个属性,可使用 XmlElement 的 GetAttribute 和 GetAttributeNode 方法,也可以将所有属性收集到一个集合中。如果需要循环访问集合,获取集合就很有用。如果您需要一个元素中的所有属性,可使用该元素的 Attributes 属性将所有属性检索到一个集合中。
将所有属性检索到一个集合中
如果您需要将一个元素节点的所有属性放入到一个集合中,可调用 XmlElement.Attributes 属性。这将获取包含元素的所有属性的 XmlAttributeCollection。XmlAttributeCollection 类从 XmlNamedNode 映射继承。因此,该集合可用的方法和属性,除了 XmlAttributeCollection 类特定的方法和属性(如 ItemOf 属性或 Append 方法)外,还包括命名的节点映射上可用的方法和属性。该属性集合中的每一项表示一个 XmlAttribute 节点。若要确定元素的属性数,请获取 XmlAttributeCollection 并使用 Count 属性查看该集合中的 XmlAttribute 节点数。
下面的代码示例显示如何检索一个属性集合,以及如何用 Count 方法作为循环索引,循环访问此集合。然后,此代码显示如何从集合中检索单个属性并显示其值。
此示例显示以下输出内容:
输出
显示集合中的所有属性
genre = novel ISBN = 1-861001-57-5 misc = sale item Display the attribute information. sale item
可按名称或索引号检索属性集合中的信息。上例显示了如何按名称检索数据。下例将显示如何按索引编号检索数据。
因为 XmlAttributeCollection 是一个集合并可以按名称或索引循环访问,本示例显示如何从该集合中选择第一个属性(使用从零开始的索引并以下面的 baseuri.xml 文件作为输入)。
输入
<!-- XML fragment --> <book genre="novel"> <title>Pride And Prejudice</title> </book>检索单个属性节点若要从元素中检索单个属性节点,应使用 XmlElement.GetAttributeNode 方法。它返回一个类型为 XmlAttribute 的对象。
有了 XmlAttribute 对象后,XmlAttribute 成员类中所有可用的方法和属性都可以用于该对象,例如查找 OwnerElement。
您也可以如前例所示,从属性集合中检索单个属性节点。下面的代码示例显示如何编写一行代码来按索引号从 XML 文档树的根节点(也称为 DocumentElement 属性)检索单个属性。
XmlAttribute attr = doc.DocumentElement.Attributes[0];