XML 文档对象模型 (DOM)

XML 文档对象模型 (DOM) 类是 XML 文档的内存中表示形式。 DOM 允许以编程方式读取、作和修改 XML 文档。 XmlReader 类也读取 XML;但是,它提供非缓存、只向前、只读的访问权限。 这意味着,没有功能可以编辑元素的属性或内容的值,或者能够使用 XmlReader 插入和删除节点。 编辑是 DOM 的主要功能。 它是 XML 数据在内存中表示的常见和结构化方式,尽管实际 XML 数据以线性方式存储在文件中或来自另一个对象时。 下面是 XML 数据。

输入

<?xml version="1.0"?>
  <books>
    <book>
        <author>Carson</author>
        <price format="dollar">31.95</price>
        <pubdate>05/01/2001</pubdate>
    </book>
    <pubinfo>
        <publisher>MSPress</publisher>
        <state>WA</state>
    </pubinfo>
  </books>

下图显示了将此 XML 数据读入 DOM 结构时如何构造内存。

XML 文档结构 XML 文档结构

在 XML 文档结构中,此图中的每个圆表示一个节点,该节点称为 XmlNode 对象。 XmlNode 对象是 DOM 树中的基本对象。 扩展 XmlNodeXmlDocument 类支持对整个文档执行作的方法(例如,将其加载到内存中或将 XML 保存到文件中)。 此外,XmlDocument 还提供了一种查看和操作整个 XML 文档中节点的方法。 XmlNodeXmlDocument 都具有性能和可用性增强功能,并具有以下方法和属性:

  • 访问和修改特定于 DOM 的节点,例如元素节点、实体引用节点等。

  • 除了节点包含的信息外,还检索整个节点,例如元素节点中的文本。

    注释

    如果应用程序不需要 DOM 提供的结构或编辑功能, 则 XmlReaderXmlWriter 类提供对 XML 的非缓存仅向前流访问。 有关详细信息,请参阅 XmlReaderXmlWriter

节点 对象具有一组方法和属性,以及基本和定义完善的特征。 其中一些特征包括:

  • 节点具有单个父节点,父节点是直接位于其上方的节点。 没有父节点的唯一节点是文档根,因为它是顶级节点,并且包含文档本身和文档片段。

  • 大多数节点可以有多个子节点,即它们正下方的节点。 下面是可以具有子节点的节点类型的列表。

    • 公文

    • DocumentFragment

    • 实体引用

    • 元素

    • 属性

    XmlDeclaration表示法实体CDATASectionTextCommentProcessingInstructionDocumentType 节点没有子节点。

  • 在图示中由 book 节点和 pubinfo 节点表示的同一级别的节点是兄弟节点。

DOM 的一个特征是它如何处理属性。 属性是不属于父子关系和同级关系的节点。 属性被视为元素节点的属性,由名称和值对组成。 例如,如果 XML 数据由与元素format="dollar关联的price组成,单词format是名称,属性format的值是dollar。 若要检索format="dollar"价格节点的属性,请在游标位于元素节点时调用 price 方法。 有关详细信息,请参阅 DOM 中的访问属性

当 XML 读入内存时,将创建节点。 但是,并非所有节点都是同一类型。 XML 中的元素具有与处理指令不同的规则和语法。 因此,读取各种数据时,会为每个节点分配节点类型。 此节点类型确定节点的特征和功能。

有关内存中生成的节点类型的详细信息,请参阅 XML 节点的类型。 有关在节点树中创建的对象的详细信息,请参阅 将对象层次结构映射到 XML 数据

Microsoft扩展了万维网联合会 (W3C) DOM 级别 1 和级别 2 中提供的 API,以便更轻松地使用 XML 文档。 虽然完全支持 W3C 标准,但其他类、方法和属性除了可以使用 W3C XML DOM 完成的功能外,还添加了功能。 使用新类可以访问关系数据,从而提供用于与 ADO.NET 数据同步的方法,同时将数据公开为 XML。 有关详细信息,请参阅将 数据集与 XmlDataDocument 同步

DOM 最适用于将 XML 数据读取到内存中以更改其结构、添加或删除节点,或修改节点保存的数据,如元素包含的文本所示。 然而,在其他场景中,有些类的速度比 DOM 更快。 若要快速、非缓存的仅转发流访问 XML,请使用 XmlReaderXmlWriter。 如果需要使用游标模型和 XPath 进行随机访问,请使用 XPathNavigator 类。

另请参阅