【发布时间】:2014-05-06 16:34:12
【问题描述】:
【问题讨论】:
-
刚刚问了我同样的问题,org.w3c.dom 出现在JDK 1.4 中,Iterator 出现在JDK 1.2 中。简单的答案是,Java Binding 的 W3C 规范又一次是由从未编写过代码(用 Java 编写)的人制定的。 NodeList 不可迭代且不遵循约定(getLength 到底是什么!)这一事实确实是一个巨大的痛苦。
【问题讨论】:
万维网联盟已将Document Object Model (DOM) 定义如下:
文档对象模型是一个平台和语言中立的 允许程序和脚本动态访问的接口 并更新文档的内容、结构和样式。
许多语言的实现看起来非常相似,很多年前聪明的人在设计它时认为这是一个好主意。 因此,它看起来不像任何语言中熟悉的东西。
如果您想使用看起来像 Java 库的 w3c DOM 的替代品,请使用JDOM。或者使用映射/绑定解决方案将您的 XML 映射到 Java 对象,例如 JAXB
但是,如果您需要与已经使用 w3c DOM 的现有库(例如内置的 XSLT 和 XSD 处理器)进行交互,那么您将无法使用它。很遗憾。
致@eis:
是的,您不能将Iterable 之类的接口添加到NodeList 是有原因的,原因是文档对象模型的Java 绑定是在the standard 中定义的。以NodeList 为例,它在标准中是 100% 定义的。没有任何额外接口的空间。
org/w3c/dom/NodeList.java:
package org.w3c.dom;
public interface NodeList {
public Node item(int index);
public int getLength();
}
C# 标准中没有绑定,但 EcmaScript 有一个。我相信您提到的 IXMLDocument 接口也用于他们的 EcmaScript 实现(但我可能是错的),在这种情况下,他们仍然需要在支持的方法和类型层次结构方面坚持标准。
不同之处在于 EcmaScript 绑定只描述了哪些方法应该存在,而 Java 绑定描述了接口中的确切方法。
尽管在 Java 中没有理由实现 NodeList 的类也不能实现 Iterable。但是,如果您的代码依赖于它,那么它将不适用于 DOM 标准,而只能用于特定的实现。
Microsoft 从来没有真正关心过这种细微的区别,因为它们通常不满足多种标准兼容的实现 - 如果您使用 Microsoft 标有“* 表示对万维网联盟 (W3C) 的扩展) DOM。”在微软的实现中,那么你没有使用 DOM 标准。
【讨论】: