11

也许这不完全是一个编程问题。但...

为什么org.w3c.dom.NodeList不是java.lang.Iterable接口的扩展?

这对我来说听起来很反直觉。特别是因为文档说:

NodeList 接口提供了节点有序集合的抽象,而无需定义或限制该集合的实现方式。DOM 中的 NodeList 对象是活动的。NodeList 中的项目可通过从 0 开始的整数索引访问。

PS:请在适用的情况下用适当的引用来支持您的答案。

4

2 回答 2

11

org.w3c.dom.NodeListpredates Iterable,它是在 Java 1.5 版中引入的。

也许出于兼容性原因它没有更新,但我没有这方面的参考资料。

于 2013-05-07T12:09:53.677 回答
2

w3c 仅定义规范(XML、XSLT、DOM 等),并没有尝试使 API 与任何特定语言或平台保持一致。

它旨在为解析器的开发人员提供指导,以生产与使用这些解析器的现有代码兼容的产品。

当您构建应用程序框架时,最好封装所有 API 调用,以便您可以控制 API 在不同语言或不同平台上的访问方式。

在 Java、JavaScript、C# 或任何您使用的语言中,创建一个包装访问 API 调用的类\对象。在 JavaScript 中,它有助于使代码跨浏览器兼容,如果您为多个平台发布解决方案,则只需更新包装类。

这是下面的示例,但是,您可以随心所欲地定义自己的包装器接口和基类,并覆盖后代类以提供特定的实现。

function XMLNode(xnode) {
  this.xnode = xnode;
}

function getNodes(path, xnode) {
  if (browseTYPE != IE) {

      //Ordered SnapShot
      if (xnode.evaluate)          
          fld = xnode.evaluate(path, xnode, null, 7, null);
      else
          fld = xnode.ownerDocument.evaluate(path, xnode, null, 7, null); 

      //We need a result wrapper here
      if (fld != null) return new XMLSnapShotList(fld); 

  } else {
      fld = xnode.selectSingleNode(path).childNodes;

      //We need a result wrapper here
      if (fld != null) return new XMLList(fld); 
  }
  return null;
}

XMLNode.prototype.getNodes = getNodes;
于 2013-05-07T12:31:26.970 回答