Sample code for 30+ languages & platforms
C

XML SearchForTag Method

See more XML Examples

Demonstrates the SearchForTag and SearchForTag2 methods.

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

<root>
    <searchRoot>
        <fruit color="red">apple</fruit>
        <fruit color="green">pear</fruit>
        <veg color="orange">carrot</veg>
        <meat animal="cow">beef</meat>
        <xyz>
            <fruit color="blue">blueberry</fruit>
            <veg color="green">broccoli</veg>
        </xyz>
        <fruit color="purple">grape</fruit>
        <cheese color="yellow">cheddar</cheese>
    </searchRoot>
    <fruit color="red">strawberry</fruit>
    <fruit color="orange">peach</fruit>
</root>

Chilkat C Downloads

C
#include <C_CkXml.h>

void ChilkatSample(void)
    {
    BOOL success;
    HCkXml xml;
    HCkXml xSearchRoot;
    HCkXml xBeginAfter;
    HCkXml xFound;
    HCkXml xSearch;

    success = FALSE;

    xml = CkXml_Create();

    // The sample input XML is available at http://www.chilkatsoft.com/data/fruitSearch.xml
    success = CkXml_LoadXmlFile(xml,"qa_data/xml/fruitSearch.xml");
    if (success != TRUE) {
        printf("%s\n",CkXml_lastErrorText(xml));
        CkXml_Dispose(xml);
        return;
    }

    // Search the sub-tree rooted at "searchRoot"
    xSearchRoot = CkXml_FindChild(xml,"searchRoot");

    // Search for all nodes having the tag "fruit"
    xBeginAfter = CkXml_GetSelf(xSearchRoot);
    xFound = CkXml_SearchForTag(xSearchRoot,xSearchRoot,"fruit");
    while ((CkXml_getLastMethodSuccess(xSearchRoot) == TRUE)) {

        printf("%s\n",CkXml_content(xFound));

        CkXml_Dispose(xBeginAfter);
        xBeginAfter = xFound;
        xFound = CkXml_SearchForTag(xSearchRoot,xBeginAfter,"fruit");
    }

    CkXml_Dispose(xBeginAfter);

    printf("--------------------------\n");

    // ---------------------------------------------------------------------------------
    // Now do the same, but instead use SearchForTag2
    // which updates the internal reference of the caller instead
    // of returning the found node.

    xBeginAfter = CkXml_GetSelf(xSearchRoot);
    xSearch = CkXml_GetSelf(xSearchRoot);

    success = CkXml_SearchForTag2(xSearch,xBeginAfter,"fruit");
    while (success == TRUE) {

        printf("%s\n",CkXml_content(xSearch));

        // Copy the internal references so that the next search
        // begins after the found node.
        CkXml_CopyRef(xBeginAfter,xSearch);
        CkXml_CopyRef(xSearch,xSearchRoot);

        success = CkXml_SearchForTag2(xSearch,xBeginAfter,"fruit");
    }

    CkXml_Dispose(xSearch);
    CkXml_Dispose(xBeginAfter);

    CkXml_Dispose(xSearchRoot);


    CkXml_Dispose(xml);

    }