|
Как уже было сказано ДОМ-документ содержит только корневой элемент. Корни в свою очередь, состоит из узлов. 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((Element) child, indent + "\t");
break;
case Node.ATTRIBUTE_NODE:
Attr attr = (Attr) child;
System.out.println("\tAttribute: '" +
attr.getName() + "' = '" + attr.getValue() + "'");
break;
case Node.COMMENT_NODE:
Comment comment = (Comment) child;
System.out.println("\tComment: '" + comment.getData() + "'");
break;
case Node.CDATA_SECTION_NODE:
CharacterData cdata = (CharacterData) child;
System.out.println("\tCDatat: '" + cdata.getData() + "'");
break;
case Node.TEXT_NODE:
Text text = (Text) child;
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= (DocumentRange) document;
|
|
|
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 = (DocumentTraversal) document;
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 + "- " +
((Element) parend).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 = (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) {
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 = (DocumentTraversal) document;
|
|
|
Иногда возникает необходимость игнорировать комментарии узлов в исходном 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);
|
|