Sample code for 30+ languages & platforms
C

XML SearchForAttribute Method

See more XML Examples

Demonstrates the SearchForAttribute method.

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();

    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");
    if (CkXml_getLastMethodSuccess(xml) == FALSE) {
        printf("searchRoot not found, searching from root.\n");
        xSearchRoot = CkXml_GetRoot(xml);
    }

    // Search for all "fruit" nodes having a color attribute
    // where the name of the color ends in "e"
    xBeginAfter = CkXml_GetSelf(xSearchRoot);
    xFound = CkXml_SearchForAttribute(xSearchRoot,xBeginAfter,"fruit","color","*e");
    while ((CkXml_getLastMethodSuccess(xSearchRoot) == TRUE)) {

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

        CkXml_Dispose(xBeginAfter);
        xBeginAfter = xFound;
        xFound = CkXml_SearchForAttribute(xSearchRoot,xBeginAfter,"fruit","color","*e");
    }

    // The correct output is:
    // grape: purple
    // blueberry: blue

    CkXml_Dispose(xBeginAfter);

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

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

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

    success = CkXml_SearchForAttribute2(xSearch,xBeginAfter,"fruit","color","*e");
    while (success == TRUE) {

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

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

        success = CkXml_SearchForAttribute2(xSearch,xBeginAfter,"fruit","color","*e");
    }

    CkXml_Dispose(xSearch);
    CkXml_Dispose(xBeginAfter);

    CkXml_Dispose(xSearchRoot);


    CkXml_Dispose(xml);

    }