我必须描述这些模型之间的差异。我知道类型和目的有什么不同吗?
3 回答
Michael Kay 已经对数据级别的差异进行了很好的总结;我将尝试在我的答案中为您提供一些设计级别的差异。
在最基本的层面上,XDM 对“项目序列”建模,而 DOM 对“节点层次结构”建模。这种区别会影响其设计的所有其他方面,从可以表示哪些数据,到如何访问和操作数据。例如,在 XQuery(甚至多个文档)中同时处理来自文档不同部分的节点非常简单,而 DOM 使这变得更加困难。
其次,这两种模型使用的类型系统具有非常不同的目标和方法。XDM 实例中的每个对象都有一个“类型注释”,而 DOM 中的每个对象要么实现一个或多个接口,要么是“基本类型”的一个实例(DOMString
、DOMTimeStamp
、DOMUserData
或之一DOMObject
)。XDM 有一个广泛且可扩展的类型系统,包括从xs:unsignedByte
s 到xs:language
标识符再到类似 DOM 的所有类型attribute
,并且需要任何使用它的语言来完全理解这个类型系统。另一方面,DOM 类型系统的范围仅限于指定其 API 绝对必要的内容(主要是 的各种扩展Node
),并尝试尽可能地与语言无关。
第三,DOM 是一种读/写数据模型,由使用和操作它的 API 定义。XDM 是一个只读模型,主要以关于“表达式的允许值”的更抽象的术语定义,并使用最小的 API 来描述节点数据访问器。由于这些不同的方法,XDM 非常适合用于函数式编程语言,而 DOM 设计用于命令式语言。此外,XDM 本身并不能真正发挥作用。实际访问和操作数据需要额外的语言层(例如 XPath/XQuery 函数和运算符规范)。相反,DOM API 是处理 DOM 数据所需的全部。
主要区别:DOM保留了一些XDM没有保留的东西,比如DOCTYPE、CDATA部分、实体和实体引用;DOM 允许以编程方式构建不满足格式良好 XML 的所有约束的树(例如,具有无效名称的节点);DOM 将命名空间视为属性而不是单独的一种节点,并允许命名空间不一致;DOM 允许相邻的文本节点。
我想强调 XDM 和 DOM 之间的只读与读写差异。虽然 DOM 旨在“操作”文档(就像现代 JavaScript 创建和修改浏览器中显示的元素一样),但 XDM 旨在“转换”数据,即从现有文档(未修改)创建新文档。
因此, XDM更适合多种数据转换,无论是基于 XPath、XSLT、XQuery 还是类似的东西,将原始数据转换为新形式或从一组给定文档中提取数据。后一种工作在多种“后端”数据处理(如在不同系统之间交换数据,每个系统都有自己的 XML 格式)或“大数据”处理(如聚合和其他分析)中非常常见。
具有讽刺意味的是,虽然 Java 和 JVM 经常作为语言和平台来进行具有大量 XML 转换的系统集成,因此在 Java 中拥有一个标准 XDM 是有意义的,但不幸的是,事实恰恰相反:JDK 来了带有 DOM (org.w3c.dom.*) 的接口,甚至在 DOM 之上指定 XPath,尽管 XDM 更适合于此!有关这会导致麻烦的示例,请参阅“XPath.evaluate 性能变慢” 。此外,Java DOM 有很多方法不是线程安全的(因为一切都是可变的)。由于其不变性,XDM 更适合数据的并行处理。
如果您想知道如何在 Java 中获取 XDM,我将快速提及JSR 255,它将其指定为 XQuery 提案的一部分,该提案似乎主要用于 XML 数据库,并且有Saxon(截至 2018 年) Java 世界中最活跃的 XPath 和 XSLT 处理器。