Navigation mit XTreeCursor
Für die Anzeige Ihrer Daten können Sie das Interface XTreeCursor verwenden.
Informationen zu diesem Vorgang
Angenommen, die Sequenz, die sich bei Auswertung eines XPath- oder XQuery-Ausdrucks bzw. eines XSLT-Style-Sheets ergibt, enthält Knoten. In dem Fall ist es für Sie sehr komfortabel, wenn Sie für den Zugriff auf den Inhalt dieser Knoten weitere XPath- oder XQuery-Ausdrücke auf die Knoten anwenden können. Sie können aber auch direkt mit der API XML durch die Baumstruktur eines Knotens navigieren.
Vorgehensweise
Beispiel
Das folgende Beispiel zeigt, wie Sie mit den Methoden des Interface XTreeCursor durch die Baumstruktur mit Ihren XML-Daten navigieren können.
/* Inhalt von library.xml
<library>
<book title='Ulysses'><author><first>James</first><last>Joyce</last></author></book>
<book title='Ada'><author><first>Vladimir</first><last>Nabokov</last></author></book>
</library>
*/
XItemFactory factory = XFactory.newInstance().getItemFactory();
XItemView item = factory.item(new StreamSource("library.xml"));
// 'tree' befindet sich anfänglich in demselben Knoten wie
// 'item', d. h. im Dokumentknoten der Eingabe.
XTreeCursor tree = item.getTreeCursor();
// Cursor tree auf Element "library" setzen
tree.toFirstChild();
// Cursor tree auf Textknoten mit Leerraum setzen
tree.toFirstChild();
// Auf erstes Element "book" setzen
tree.toNextSibling();
// Auf Textknoten mit Leerraum setzen
tree.toNextSibling();
// Auf zweites Element "book" setzen
tree.toNextSibling();
// Zweite Instanz von XTreeCursor erstellen, die zunächst auf
// denselben Knoten wie 'tree' gesetzt wird, d. h. auf das
// zweite Element "book"
XTreeCursor secondBook = tree.getTreeCursor();
// 'tree' auf Element "library" setzen
tree.toParent();
// 'secondBook' auf Attribut "title" setzen
secondBook.toFirstAttribute();
Das folgende Beispiel zeigt die Navigation durch alle Knoten in einer Baumstruktur mit Tiefensuche.
XItemFactory factory = XFactory.newInstance().getItemFactory();
XItemView item = factory.item(new StreamSource("library.xml"));
XTreeCursor tree = item.getTreeCursor();
boolean hasMoreNodes = true;
do {
// Aktuellen Knoten verarbeiten
if (tree.toFirstAttribute()) {
do {
// Process attributes
} while (tree.toNextAttribute());
tree.toParent();
}
if (tree.toFirstNamespace()) {
do {
// Namespaces verarbeiten
} while (tree.toFirstNamespace());
tree.toParent();
}
boolean foundNext = false;
// Als Nächstes auf aktuellen Knoten zugreifen, wenn dieser ein untergeordnetes Element hat.
// Andernfalls auf nächstes gleichgeordnetes Element zugreifen.
if (tree.toFirstChild() || tree.toNextSibling()) {
foundNext = true;
// Wenn kein untergeordnetes und kein gleichgeordnetes Element vorhanden ist,
// das gleichgeordnete Element eines Vorgängerelements suchen
} else {
do {
hasMoreNodes = tree.toParent();
if (hasMoreNodes) {
foundNext = tree.toNextSibling();
}
} while (hasMoreNodes && !foundNext);
}
} while (hasMoreNodes);