HTML+DOM与XML+DOM之间的区别与联系

简介: 像在座阅读此文的读者一样,由于自身的兴趣,我对 AJAX 编程方面的研究是持续不断的。随着该领域的深入,我越来越发觉所谓的浏览器 DOM,即 HTML DOM,是一个非常值得关注的点。在与资深的技术人员们交换意见的时候,也曾谈到过这样的观点,就是关于 DOM Level 1,我们仍然缺乏具有深度的、规范的辅助读物,而且网络上搜索也比较少见。

像在座阅读此文的读者一样,由于自身的兴趣,我对 AJAX 编程方面的研究是持续不断的。随着该领域的深入,我越来越发觉所谓的浏览器 DOM,即 HTML DOM,是一个非常值得关注的点。在与资深的技术人员们交换意见的时候,也曾谈到过这样的观点,就是关于 DOM Level 1,我们仍然缺乏具有深度的、规范的辅助读物,而且网络上搜索也比较少见。我们真正的想法在于,工作的时候我们不仅仅是去翻阅工具库/ API 那些高级的抽象内容。

为此我打算在本文中拨开其中的云雾,如果您正好想用用“ DOM-脚本”做很多的事情,那么接下来课题内容便适合您了,也可以当作抛砖引玉的 DOM 介绍。本文内容的主题便是,为什么开发者要认为“DOM Level 1规范的架构”是至关重要的,其突出的重要性在哪里等等,以及还有 HTML DOM 和  XML DOM 之间微妙的区别及内在的联系。

W3C  所制订的 DOM Level 分为两大模块:Core 和 HTML。第一个大模块是 Core 核心,W3C 规范是这样描述 Core 的:

“满足软件开发者和 Web 脚本编写者,访问和操控产品项目中包含的可解析的 HTML 和 XML  内容。”
"sufficicent to allow software developers and web script authora toaccess and mainipulate parsed HTML and XML content inside conformingproducts."

第二个为 HTML 模块,其规范描述是:

“HTML 之中特定元素的功能,和恰到好处的、易用的、针对常见性任务的 HTML 文档操作机制。”
"functionality that depends on specific elements defined in HTML"

以上可见两者的重要性。同时 HTML 模块的意义也在于,解决了向后兼容的问题,这在当今符合 DOM Level 1 的浏览器中已经可以提供适应的解决方案。

按照这样的说法,如果您仍然不能理解上述的要义,我们则可以这样认为,HTML 文档可以使用 Core API 和 HTML API 两者;而 XML 文档只能使用 Core API。换句话说,HTML 与 XML 重叠的部分有 Core API,而 HTML API 则是不能共享的部分,顾名思义限于 HTML 文档所使用。这是我们对 Core/HTML 的初步认识。

理解 DOM Level 1 Core

理解 DOM Level 1 Core 之要义实质在于将 Core 看待成为多个“节点(Nodes)"而组成的"文档(Document)",也就是说,此文档结构中可允许存在着大量的条目项,其每一项都可理解为“节点(Node)”。讨论该结构可以以从两个方面入手:一、一切皆是节点对象(Node Object,从扁平化的角度去理解,flattened view,乃适合于多态下的接口);二、每个对象继承于基类节点,实现了节点的接口(interface,OO 继承的角度去理解);

请观察一下这段 HTML:

<div id="myDiv">Hello World</div>

这是一个闭合的 div 标签。由 DOM Level 1 的层面来分析可以有以下几点内容:

  • 标签 div 可作为“节点对象 Node Object(扁平化角度,前面已述)”,或者元素对象 Element Object (继承的角度 - 元素继承于 Node)。
  • 节点属性 id 也可作为“节点对象 Node Object(扁平化角度)”,或者属性对象 Attribute Object(继承的角度 - Attr 继承于 Node)。
  • 文本“Hello world”也可作为“节点对象 Node Object(扁平化角度)”,字符串对象 CharacterData对象(继承的角度 - CharacterData 继承于 Node),Text 文本对象(继承的角度 - Text 继承于 CharacterData)。

稍微归纳一下,就是 DOM 1 Core 部分中一切皆是节点,节点以及其接口都可实现在每个对象身上(从继承的角度理解出发),实现了节点接口才可以有节点的属性、方法。——这是我们理解的前提。然后,根据特定的节点类型的不同,其接口的属性和方法都是不同的,视乎 DOM 对该节点的设计而定。

理解 DOM Level 1 HTML

我们日常工作的时候,都跟 HTML 文档打交道,其实就是属于 W3C 所规定的 DOM Level 1 HTML 模块内的范畴。HTML DOM 的特性和方法不是标准的 DOM 实现,而是是专门针对 HTML 而设的,同时也考虑到使得 DOM 操作变的更为简便。HTML 模块集中表现在 HTMLElement 接口上,即为全体元素类型的对象所实现的接口。就该文讨论的范围而言,HTMLElement 接口的参与形式与上述的 Node 节点接口非常地相似。一旦引入了 OO 设计观,只要实现了 HTMLElement 接口的对象,就可以定义它为元素了。一份 HTML 文档有相当多的都是元素,当然还有,表示文档本身的 HTMLDocument 和集合容器 HTMLCollection 等等。

因此,要准确理解 DOM 1 HTML 的模块,必须认识其接口是基于元素的(Element-based),而不是基于节点的(Node-based)。那样的话,元素方式与节点方式到底又有什么区别呢(Element v.s Node),应该如何界定两者呢?例如节点属性(properties of elements),当在“基于元素”的语境中,就是“属性(attributes)”,并非独立的节点对象。——尽管按照某个角度讲,元素是节点的一种特例,我们仍可保留“节点”这一说法,一个标签(tag)便是一个 “节点”。假如我们要得到 id 属性的字符串的值是什么,采用DOM 1 Core 的方式就是,

myElement.attributes["id"].value; // 从Node接口提供的属性

等于下面的方法:

myElement.getAttributes("id"); // 从Element实现的方法返回

但使用 DOM 1 HTML 方式的话,我们仅仅如此:

myElement.id;

这般就可以获取 id 了。此时此刻,你可能会认为,XML 文档本身就不一定缺省有 id 的属性,而因为有你所说的 HTMLElement.id 属性预先定义在 API 中,当然 HTML 中的每个元素就有 id 的属性啦!?——这里的意思没有错,也不妨碍我们的理解。的确全体的 HTML 元素均有 id 一项的属性,不管 HTMLDivElement/HTMLImageElement/……

Core or HTML Module?

既然这样,那我应该使用 Core 的 API,还是 HTML 模块的 API?对于 HTML 的文档来说,用 Core 或 HTML Module 实际差别不大。本来我们一直都不太强调这种界定,以致忽略了它们细微的差异。如果我们觉得还是模棱两可的话,我们可进一步查探它们的明细。个人认为处理 XHTML 并使用 Core API 这样更能够说明 XHTML 中的 “X”,即表明这份 HTML 就是一份标准的 XML 文档,以便与原有 HTML 4.1 从语义上区别开来。但请记住,当处理一份 XML 结构的文档的时候,自然而然就是采用 Core 去处理。通过XHMLHttpRequest 请求执行后所返回的 responseXML 结果对象,那只能使用 Core 的 API 去处理分析,就不能够采用 HTML 的了。

小结

通过文本开发者应该明白到,HTML DOM 与 XML DOM 之间,既有区别,又有联系。一般而言,除了上述比较外,须值得一提的就是,HTML 是可以允许不 Well-Form 的,XML 则不然。

By Frank(zhangxin)

目录
相关文章
|
12月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
146 1
|
12月前
|
JavaScript 前端开发 容器
用HTML DOM实现有条件地渲染网页元素(上)
用HTML DOM实现有条件地渲染网页元素(上)
|
12月前
|
存储 JavaScript 前端开发
用HTML DOM实现有条件地渲染网页元素(下)
用HTML DOM实现有条件地渲染网页元素(下)
|
9月前
|
XML 存储 数据格式
HTML(HyperText Markup Language)和XML(Extensible Markup Language)
HTML(HyperText Markup Language)和XML(Extensible Markup Language)
114 16
|
11月前
|
JavaScript 前端开发 算法
真实DOM和虚拟DOM有哪些区别?
本文介绍了真实DOM和虚拟DOM的概念、使用方式、优势、劣势、使用场景、影响因素、开发效率和性能对比。真实DOM是浏览器提供的原生接口,直接操作简单直观,但频繁操作会导致性能损耗。虚拟DOM是真实DOM的抽象表示,通过比较差异减少DOM操作,适用于大规模数据变更和复杂交互的页面。开发者应根据具体需求选择合适的DOM操作方式,以提高页面性能和开发效率。
505 1
真实DOM和虚拟DOM有哪些区别?
|
12月前
|
JavaScript 前端开发
JavaScript HTML DOM
JavaScript HTML DOM
80 2
JavaScript HTML DOM
|
11月前
|
JavaScript
HTML DOM 节点树
HTML DOM 节点是指在 HTML 文档对象模型中,文档中的所有内容都被视为节点。整个文档是一个文档节点,每个 HTML 元素是元素节点,元素内的文本是文本节点,属性是属性节点,注释是注释节点。DOM 将文档表示为节点树,节点之间有父子和同胞关系。
|
11月前
|
JavaScript
HTML DOM 节点
HTML DOM(文档对象模型)将HTML文档视为节点树,其中每个部分都是节点:文档本身是文档节点,HTML元素是元素节点,元素内的文本是文本节点,属性是属性节点,注释是注释节点。节点间存在父子及同胞关系,形成层次结构。
|
前端开发
HTML 颜色的不用写法和最终显示效果的区别
HTML 中色彩的指定有多种方式,包括十六进制(如 `#FF5733`)、RGB(如 `rgb(255, 87, 51)`)、RGBA(如 `rgba(255, 87, 51, 0.5)`)、HSL(如 `hsl(14, 100%, 60%)`)、HSLA(如 `hsla(14, 100%, 60%, 0.5)`)以及直接使用颜色名称(如 `orange`)。这些方法虽然最终显示效果可能相同,但在使用场景和灵活性上各具优势。十六进制和 RGB 更常用,HSL 则便于调整颜色属性,而 RGBA 和 HSLA 增加了透明度选项,颜色名称则提高了代码的可读性。
|
12月前
|
JavaScript 前端开发 索引
JavaScript HTML DOM 节点列表
JavaScript HTML DOM 节点列表
94 5