我可以在 Java 中使用 for-each 遍历 NodeList 吗?

新手上路,请多包涵

我想在 Java 中使用 for-each 循环遍历 NodeList 。我让它使用 for 循环和 do-while 循环,但不是 for-each。

 NodeList nList = dom.getElementsByTagName("year");
do {
    Element ele = (Element) nList.item(i);
    list.add(ele.getElementsByTagName("MonthId").item(0).getTextContent());
    i++;
} while (i < nList.getLength());

NodeList nList = dom.getElementsByTagName("year");

for (int i = 0; i < nList.getLength(); i++) {
    Element ele = (Element) nList.item(i);
    list.add(ele.getElementsByTagName("MonthId").item(0).getTextContent());
}

原文由 user2919834 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 772
2 个回答

这个问题的解决方法很简单,幸运的是你只需实施一次。

 import java.util.*;
import org.w3c.dom.*;

public final class XmlUtil {
  private XmlUtil(){}

  public static List<Node> asList(NodeList n) {
    return n.getLength()==0?
      Collections.<Node>emptyList(): new NodeListWrapper(n);
  }
  static final class NodeListWrapper extends AbstractList<Node>
  implements RandomAccess {
    private final NodeList list;
    NodeListWrapper(NodeList l) {
      list=l;
    }
    public Node get(int index) {
      return list.item(index);
    }
    public int size() {
      return list.getLength();
    }
  }
}

一旦您将此实用程序类添加到您的项目并添加了 static importXmlUtil.asList 方法添加到您的源代码中,您可以像这样使用它:

 for(Node n: asList(dom.getElementsByTagName("year"))) {
  …
}

原文由 Holger 发布,翻译遵循 CC BY-SA 3.0 许可协议

我知道聚会已经晚了,但是……

从 Java-8 开始,您可以使用 lambda 表达式(用于创建新的 Iterable )和默认方法(用于 Iterator.remove )更简洁地编写 @RayHulha 的解决方案

 public static Iterable<Node> iterable(final NodeList nodeList) {
    return () -> new Iterator<Node>() {

        private int index = 0;

        @Override
        public boolean hasNext() {
            return index < nodeList.getLength();
        }

        @Override
        public Node next() {
            if (!hasNext())
                throw new NoSuchElementException();
            return nodeList.item(index++);
        }
    };
}

然后像这样使用它:

 NodeList nodeList = ...;
for (Node node : iterable(nodeList)) {
    // ....
}

或等效地像这样:

 NodeList nodeList = ...;
iterable(nodeList).forEach(node -> {
    // ....
});

原文由 Thomas Fritsch 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题