为什么NodeList不扩展Collection或Iterable?

时间:2013-05-07 11:59:31

标签: java dom xml-parsing nodelist

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

为什么org.w3c.dom.NodeList不是java.lang.Iterable界面的扩展名?

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

  

NodeList接口提供有序节点集合的抽象,而不定义或约束此集合的实现方式。 DOM中的NodeList对象是实时的。   NodeList中的项目可以通过整数索引访问,从0开始。

PS:如果适用,请在适当的引文中回复您的答案。

2 个答案:

答案 0 :(得分:9)

org.w3c.dom.NodeList早于Java版本1.5中引入的Iterable

可能因为兼容性原因没有更新,但我没有参考。

答案 1 :(得分: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;