There is a way to travers a DOM-tree like an ordinary linear list. For these purposes DOM interface suggests NodeIterator interface. Besides flatting, such iterator can also filter the nodes found in the source tree. This approach allows to avoid multiple checking of current node type as well as using recursive method-calls for browsing the tree. The following program shows how to traverse DOM-elements only:

 import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.NodeIterator;

import org.w3c.dom.*;

 * This sample program using node-iterator for
 * linear traverse of DOM-document.

public class Test {

  public static void main(String[] args) {
  try {
    // load the document from a file:
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder loader = factory.newDocumentBuilder();
    Document document = loader.parse("sample.xml");
    // this cast is checked on Apache implementation (Xerces):
    DocumentTraversal traversal = (DocumentTraversal) document;

    NodeIterator iterator = traversal.createNodeIterator(
      document.getDocumentElement(), NodeFilter.SHOW_ELEMENT, null, true);

    for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) {
      System.out.println("Element: " + ((Element) n).getTagName());

  } catch (Exception ex) {