也许这不完全是一个编程问题。但...
为什么org.w3c.dom.NodeList不是java.lang.Iterable接口的扩展?
这对我来说听起来很反直觉。特别是因为文档说:
NodeList 接口提供了节点有序集合的抽象,而无需定义或限制该集合的实现方式。DOM 中的 NodeList 对象是活动的。NodeList 中的项目可通过从 0 开始的整数索引访问。
PS:请在适用的情况下用适当的引用来支持您的答案。
也许这不完全是一个编程问题。但...
为什么org.w3c.dom.NodeList不是java.lang.Iterable接口的扩展?
这对我来说听起来很反直觉。特别是因为文档说:
NodeList 接口提供了节点有序集合的抽象,而无需定义或限制该集合的实现方式。DOM 中的 NodeList 对象是活动的。NodeList 中的项目可通过从 0 开始的整数索引访问。
PS:请在适用的情况下用适当的引用来支持您的答案。
org.w3c.dom.NodeList
predates Iterable
,它是在 Java 1.5 版中引入的。
也许出于兼容性原因它没有更新,但我没有这方面的参考资料。
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;