org.w3c.dom.NodeList不扩展Iterable

pra*_*pes 5 java dom

有没有理由为什么Java org.w3c.dom库的作者会选择不支持Iterable接口?例如,接口NodeList似乎非常适合扩展Iterable.

Erw*_*idt 5

万维网联盟定义了文档对象模型 (DOM),如下所示:

文档对象模型是一个平台和语言中立的 接口,允许程序和脚本动态访问和更新文档的内容、结构和样式。

它对多种语言的实现看起来非常相似,聪明的人在很多年前设计它时就认为这是一个好主意。结果,它看起来不像任何语言中的任何熟悉的东西。

如果您想使用看起来像 Java 库的 w3c DOM 替代方案,请使用JDOM。或者使用映射/绑定解决方案(例如JAXB)将 XML 映射到 Java 对象

但是,如果您需要与已经使用 w3c DOM 的现有库(如内置 XSLT 和 XSD 处理器)进行交互,那么您就只能使用它了。很遗憾。


致@eis:

是的,您无法添加诸如Iterableto之类的接口是有原因NodeList的,这个原因是文档对象模型的 Java 绑定是在标准. 就拿 来说NodeList,它在标准中是 100% 定义的。没有空间容纳任何额外的接口。

org/w3c/dom/NodeList.java:

package org.w3c.dom;

public interface NodeList {
    public Node item(int index);

    public int getLength();

}
Run Code Online (Sandbox Code Playgroud)

C# 标准中没有绑定,但 EcmaScript 有一个绑定。我相信您提到的 IXMLDocument 接口也用于其 EcmaScript 实现(但我可能是错的),在这种情况下,它们仍然需要在支持的方法和类型层次结构方面遵守标准。

不同之处在于,EcmaScript 绑定仅描述应该存在哪些方法,而 Java 绑定则描述接口中的确切方法。但在 Java 中,实现的类没有理由NodeList不能实现Iterable。但是,如果您的代码依赖于此,它将无法与 DOM 标准一起使用,而只能与特定的实现一起使用。

Microsoft 从来没有真正关心过这种细微的区别,因为它们通常不满足多种标准兼容的实现 - 如果您使用 Microsoft 标有“* 表示万维网联盟 (W3C) DOM 的扩展”的任何方法。 ” 在微软的实现中,那么你就没有使用DOM标准。