Как уже было сказано ДОМ-документ содержит только корневой элемент. Корни в свою очередь, состоит из узлов. XML-элемента конкретные типы этих узлов. Кроме элементами узлы можно также комментарии, текст, атрибуты, обозначения, инструкции по обработке и события документ, он себе. Так, когда мы просим ребенка из элементов мы получаем узле неизвестного типа, мы можем использовать свои getNodeValue () для указывает его тип и подавать в соответствующие интерфейса:


import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;



import org.w3c.dom.*;



/**

 * This sample program shows how to browse through DOM-tree,

 * determine the types of DOM-nodes and printing their 

 * specific contents.

 */



public class Test {

  public static void main(String[] args) {

    try {

      // first of all we request out 

      // DOM-implementation:

      DocumentBuilderFactory factory = 

        DocumentBuilderFactory.newInstance();

      // then we have to create document-loader:

      DocumentBuilder loader = factory.newDocumentBuilder();



      // loading a document...

      Document document = loader.parse("sample.xml");

      

      // access to root element:

      Element purchaseOrder = document.getDocumentElement();

      

      // print a document element content:

      printElement(purchaseOrder, "");

            

    catch (Exception ex) {

      ex.printStackTrace();

    }

  }

  

  public static final void printElement(Element element, String indent) {

    System.out.println("Element '" + element.getNodeName() "'");

    

    NodeList children = element.getChildNodes();

    for (int i = 0; i < children.getLength(); i++) {

      Node child = children.item(i);

      

      switch (child.getNodeType()) {

      case Node.ELEMENT_NODE:

        // recursive call for all element children:

        printElement((Elementchild, indent + "\t");

        break;

      case Node.ATTRIBUTE_NODE:

        Attr attr = (Attrchild;

        System.out.println("\tAttribute: '" 

          attr.getName() "' = '" + attr.getValue() "'");

        break;

      case Node.COMMENT_NODE:

        Comment comment = (Commentchild;

        System.out.println("\tComment: '" + comment.getData() "'");

        break;

      case Node.CDATA_SECTION_NODE:

        CharacterData cdata = (CharacterDatachild;

        System.out.println("\tCDatat: '" + cdata.getData() "'");

        break;

      case Node.TEXT_NODE:

        Text text = (Textchild;

        System.out.println("\tText: '" + text.getData() "'");

        break;

      // ... all cases remaining ...

      default:

        System.out.println("\tUnknown node type: '" 

          + child.getNodeType() "'");

        break;

      }

    }

  }

}

Диапазон appered первый в DOM Level 2. Этот механизм позволяет работать с набором данных документа фрагментов. Когда диапазон определяется она может быть использована для копирования, изменения и даже удаления.

Точки входа есть интерфейс DocumentRange. Существует нет явного способа, как геттер методы DOM, чтобы получить экземпляр DocumentRange. Но большинство реализаций предполагает, что ДОМ-документе также implementats реализацию этого интерфейса. Таким образом, в следующем примере показано, как получить обхода инструментом из ДОМ-документа:


  // first you get a document somewhere: create or load from a file:

  Document document = loader....;

  // ...

  

  // then you can simply cast you document instance to range-interface:    

  DocumentRange ranges= (DocumentRangedocument;

DOM интерфейс предлагает хороший инструмент для просмотра дерева. Это интерфейс TreeWalker. Это позволяет выполняет фильтрацию на узле потоке, удобная навигация и сохранения текущей позиции для следующих возвращения. Пример приложения приведены пройти ДОМ-дерево на элементе только с помощью TreeWalker:


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.TreeWalker;



import org.w3c.dom.*;



/**

 * This sample program using tree-walker for

 * non-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 = (DocumentTraversaldocument;



    TreeWalker walker = traversal.createTreeWalker(

      document.getDocumentElement()

      NodeFilter.SHOW_ELEMENT, null, true);



    traverseLevel(walker, "");



  catch (Exception ex) {

    ex.printStackTrace();

  }

  }



  private static final void traverseLevel(TreeWalker walker, 

    String indent) {

  

    // describe current node:

    Node parend = walker.getCurrentNode();

    System.out.println(indent + "- " 

      ((Elementparend).getTagName());



    // traverse children:

    for (Node n = walker.firstChild(); n != null

      n = walker.nextSibling()) {

      

      traverseLevel(walker, indent + '\t');

    }



    // return position to the current (level up):

    walker.setCurrentNode(parend);

  }

}

Поскольку DOM является модель документа, DOM-документ может быть создан непосредственно, без загрузки из файла XML. Хотя, с тем чтобы создать новый документ DOM мы должны использовать те же DocumentBuilder. После документ создается она должна быть снабжена документом (корень) элементом. Все элементы создается с помощью метода класса документа:


import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.FactoryConfigurationError;

import javax.xml.parsers.ParserConfigurationException;



import org.w3c.dom.*;



/**

 * This sample program shows how to create new document 

 * from stretch using DOM interface.

 */



public class Test {

  public static void main(String[] args) {

    try {

      // first of all we request out 

      // DOM-implementation:

      DocumentBuilderFactory factory = 

        DocumentBuilderFactory.newInstance();

      // then we have to create document-loader:

      DocumentBuilder loader = factory.newDocumentBuilder();



      // createing a new DOM-document...

      Document document = loader.newDocument();

      

      // initially it has no root-element, ... so we create it:

      Element root = document.createElement("purchase-order");

      

      // we can add an element to a document only once,

      // the following calls will raise exceptions:

      document.appendChild(root);



      // ... compose the rest document content ...

      

    catch (ParserConfigurationException ex) {

      // document-loader cannot be created which,

      // satisfies the configuration requested

      handleError(ex);

    catch (FactoryConfigurationError ex) {

      // DOM-implementation is not available or 

      // cannot be instantiated:

      handleError(ex);

    }

  }



  private static final void handleError(Throwable ex) {

    // ... handle error here...

  }

}

Если JRE внедрения используется для запуска приложения вы не содержит встроенного ДОМ-реализации (или не нравится), вы можете настроить его с помощью системных свойств. DocumentBuilderFactoryis Когда попросили предъявить новые экземпляры, он ищет для системных свойств запись с именем javax.xml.parsers.DocumentBuilderFactory. Это свойство должно содержать имя класса реализации DOM. ниже пример показывает, как заставить Apache реализации DOM:


  // configure DOM-implementation we want to use:

  System.setProperty("javax.xml.parsers.DocumentBuilderFactory",

    "org.apache.crimson.jaxp.DocumentBuilderFactoryImpl");

      

  // now use JAXP interface to instantiate DOM-implementation:

  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    

  // then we have to create document-loader:

  DocumentBuilder loader = factory.newDocumentBuilder();

Проверка представляет собой процесс проверки исходного XML документа, чтобы соответствовать его DOCTYPE referes. Если документ соответствует его Doc-типа, то Calles действительными, в противном случае документ является недействительным. Для того, чтобы рассказать SAX, чтобы проверить документ на действия correspodning собственности ДОМ-builderfactory должно быть установлено так, как следующим образом:


  // create new factory is ordinary way:

  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();



  // specifies that the builder produced by this factory will

  // validate documents as they are parsed.

  factory.setValidating(true);



  

  // this loader will validate XML-input:

  DocumentBuilder loader = factory.newDocumentBuilder();

Поскольку DOM является только интерфейсом, с тем чтобы использовать это приложение должно определить ее осуществления. DOM реализации в Java может быть установлена через систему собственности javax.xml.parsers.DocumentBuilderFactory. Xerces Так как пакет был интегрирован с Java Runtime Envorinment, эта реализация используется по умолчанию. По этой причине, в общем случае нет необходимости указывать альтернативный реализаций:


  // request default built-in DOM-implementation:

  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();



  // then we may create document-builder:

  DocumentBuilder loader = factory.newDocumentBuilder();



  // now we're ready to create DOM-documents...

Существует способ траверс DOM-дерево, как обычный линейный список. В этих целях DOM интерфейс предлагает NodeIterator интерфейса. Кроме того, прокатка, такой итератор Также можно отфильтровать узлы найти в дереве исходных текстов. Такой подход позволяет избежать многочисленных проверка текущего типа узла, а также использования метода рекурсивных вызовов для просмотра дерева. Следующая программа показывает, как пройти ДОМ-элементами только:


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 = (DocumentTraversaldocument;



    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: " ((Elementn).getTagName());

    }



  catch (Exception ex) {

    ex.printStackTrace();

  }

  }

}

Поскольку уровень 2 DOM имеет набор инструментов, позволяющих thrgough удобной навигации DOM-дерево. Новый пакет содержит org.w3c.dom.traversal означать для фильтрации узлам битная маска, линейных итераций и прогулки по дереву. Точки входа есть интерфейс DocumentTraversal. Существует нет явного способа, как геттер методы DOM, чтобы получить экземпляр DocumentTraversal. Но большинство реализаций предполагает, что ДОМ-документе также implementats реализацию этого интерфейса. Таким образом, в следующем примере показано, как получить обхода инструментом из ДОМ-документа:


  // first you get a document somewhere: create or load from a file:

  Document document = loader....;

  // ...

  

  // then you can simply cast you document instance to traversal:    

  DocumentTraversal traversal = (DocumentTraversaldocument;

Иногда возникает необходимость игнорировать комментарии узлов в исходном XML-файла, а производство DOM-документа. Это позволяет избежать дополнительной проверкой типов узлов, при просмотре DOM-дерева. Для того, чтобы игнорировать комментариев соответствующее свойство объекта DocumentBuilderFactory должны быть установлены к истине. Следующий пример показывает, что:


  // create new factory is ordinary way:

  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();



  // this will make the parsers produced by this factory will

  // ignore comments; by default comment-nodes are processed to DOM-tree:

  factory.setIgnoringComments(true);