【问题标题】:org.w3c.dom.NodeList doesn't extend Iterableorg.w3c.dom.NodeList 不扩展 Iterable
【发布时间】:2014-05-06 16:34:12
【问题描述】:

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

【问题讨论】:

  • 刚刚问了我同样的问题,org.w3c.dom 出现在JDK 1.4 中,Iterator 出现在JDK 1.2 中。简单的答案是,Java Binding 的 W3C 规范又一次是由从未编写过代码(用 Java 编写)的人制定的。 NodeList 不可迭代且不遵循约定(getLength 到底是什么!)这一事实确实是一个巨大的痛苦。

标签: java dom


【解决方案1】:

万维网联盟已将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 标准。

【讨论】:

  • 我不认为 DOM 是语言中立的接口与 java 接口 org.w3c.dom 库实现的事实有关。例如,微软的 MSXML DOM 有IXMLDOMDocumentIXMLDOMDocument2IXMLDOMDocument3 接口,这些接口相互补充,为 DOM 规范添加了扩展。
  • 简而言之:AFAIK 规范没有强制要求阻止 java 在 org.w3c.dom 中以类似方式添加特定于 java 的接口,例如 Iterable。
  • @eis 添加了我对上述答案的回复
  • 嗯,好的。所以显然java绑定由标准提供的,在附录中,所以你是对的。您可以在答案中使用this 链接来引用它们。
猜你喜欢
  • 1970-01-01
  • 2015-10-10
  • 2019-11-07
  • 2019-07-04
  • 2020-02-20
  • 2011-08-22
  • 2017-03-19
  • 2018-01-10
  • 1970-01-01
相关资源
最近更新 更多