WAS v8.5 > Develop applications > XML applications > Use the XML API to perform operations > Performing basic operations

Navigating with XTreeCursor

We can use the XTreeCursor interface to view your data. Suppose the sequence that results from evaluating an XPath or XQuery expression or an XSLT stylesheet contains nodes. You will find it very convenient to access the contents of those nodes by applying further XPath or XQuery expressions to those nodes. However, you might also choose to navigate through the tree structure associated with a node directly through the XML API.


Example

The following example shows how we can use the methods on the XTreeCursor interface to navigate through the tree containing your XML data.

/* Contents of 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' is initially positioned at the same node as // 'item' - that is, the document node of the input
XTreeCursor tree = item.getTreeCursor();

// Position tree cursor to "library" element tree.toFirstChild();

// Position tree cursor to white-space text node tree.toFirstChild();

// Position to first "book" element tree.toNextSibling();

// Position to white-space text node tree.toNextSibling();

// Position to second "book" element tree.toNextSibling();

// Create a second instance of XTreeCursor that is initially // positioned at the same node as 'tree' - that is, the // second "book" element XTreeCursor secondBook = tree.getTreeCursor();

// Position 'tree' to "library" element tree.toParent();

// Position 'secondBook' to "title" attribute secondBook.toFirstAttribute();

The following example navigates through all the nodes in a tree in a depth-first fashion.

XItemFactory factory = XFactory.newInstance().getItemFactory();
XItemView item = factory.item(new StreamSource("library.xml"));

XTreeCursor tree = item.getTreeCursor();
boolean hasMoreNodes = true;

do {
    // Process current node 
    if (tree.toFirstAttribute()) {
        do {
            // Process attributes         } while (tree.toNextAttribute());
        tree.toParent();
    }

    if (tree.toFirstNamespace()) {
        do {
            // Process namespaces
        } while (tree.toFirstNamespace());
        tree.toParent();
    }

    boolean foundNext = false;

    // If the current node has a child, visit it next
    // If there's no child, go to the next sibling
    if (tree.toFirstChild() || tree.toNextSibling()) {
        foundNext = true;

    // If there's no child and no sibling, find an     // ancestor's sibling instead.
    } else {
        do {
            hasMoreNodes = tree.toParent();
            if (hasMoreNodes) {
                foundNext = tree.toNextSibling();
            }
        } while (hasMoreNodes && !foundNext);
    }} while (hasMoreNodes);


+

Search Tips   |   Advanced Search