Sample code for 30+ languages & platforms
DataFlex

XML Tree Traversal Order for Search* Methods

See more XML Examples

The Chilkat XML API provides a number of Search* methods for locating XML nodes based on criteria. These methods traverse an XML document in a breadth-first order. (See Breadth-First Search).

The XML document used in this example has the following tree structure:

The nodes are traversed in the order: A, B, C, D, E, F, G, H, I, J, K.

The input XML, available at http://www.chilkatsoft.com/data/searchOrder.xml, is this:

<a>crocodileA
    <b>crocodileB
        <d>crocodileD</d>
        <e>crocodileE
            <h>crocodileH</h>
            <i>crocodileI</i>
        </e>
    </b>
    <c>crocodileC
        <f>crocodileF</f>
        <g>crocodileG
            <j>crocodileJ</j>
            <k>crocodileK</k>
        </g>
    </c>
</a>

Chilkat DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoXml
    Variant vXBeginAfter
    Handle hoXBeginAfter
    Variant vXFound
    Handle hoXFound
    String sTemp1

    Move False To iSuccess

    Get Create (RefClass(cComChilkatXml)) To hoXml
    If (Not(IsComObjectCreated(hoXml))) Begin
        Send CreateComObject of hoXml
    End

    // The sample input XML is available at http://www.chilkatsoft.com/data/searchOrder.xml
    Get ComLoadXmlFile Of hoXml "searchOrder.xml" To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoXml To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    // IMPORTANT:  The following loop for iterating over all 
    // matching nodes performs reasonably well for small to 
    // mid-size XML documents or sub-trees.  Performance
    // can be poor when the sub-tree contains many thousands
    // of nodes (or more).

    // NOTE:  The search is always rooted at the calling node.
    // In this example, it happens to also be the root node of the entire
    // XML document.  Searches can be performed on sub-trees
    // within the document by calling the Search* method from
    // the root node of a sub-tree.

    // Demonstrate the breadth-first traversal:
    Get ComGetSelf Of hoXml To vXBeginAfter
    If (IsComObject(vXBeginAfter)) Begin
        Get Create (RefClass(cComChilkatXml)) To hoXBeginAfter
        Set pvComObject Of hoXBeginAfter To vXBeginAfter
    End
    Get ComSearchAllForContent Of hoXml vXBeginAfter "*croc*" To vXFound
    If (IsComObject(vXFound)) Begin
        Get Create (RefClass(cComChilkatXml)) To hoXFound
        Set pvComObject Of hoXFound To vXFound
    End
    While ((ComLastMethodSuccess(hoXml)) = True)

        Get ComTag Of hoXFound To sTemp1
        Showln sTemp1

        Send Destroy of hoXBeginAfter
        Move hoXFound To hoXBeginAfter
        Get ComSearchAllForContent Of hoXml vXBeginAfter "*croc*" To vXFound
        If (IsComObject(vXFound)) Begin
            Get Create (RefClass(cComChilkatXml)) To hoXFound
            Set pvComObject Of hoXFound To vXFound
        End
    Loop

    Send Destroy of hoXBeginAfter


End_Procedure