Sample code for 30+ languages & platforms
Unicode 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 Unicode C Downloads

Unicode C
#include <C_CkXmlW.h>

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

    success = FALSE;

    xml = CkXmlW_Create();

    success = CkXmlW_LoadXmlFile(xml,L"qa_data/xml/fruitSearch.xml");
    if (success != TRUE) {
        wprintf(L"%s\n",CkXmlW_lastErrorText(xml));
        CkXmlW_Dispose(xml);
        return;
    }

    // Search the sub-tree rooted at "searchRoot"
    xSearchRoot = CkXmlW_FindChild(xml,L"searchRoot");
    if (CkXmlW_getLastMethodSuccess(xml) == FALSE) {
        wprintf(L"searchRoot not found, searching from root.\n");
        xSearchRoot = CkXmlW_GetRoot(xml);
    }

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

        wprintf(L"%s: %s\n",CkXmlW_content(xFound),CkXmlW_getAttrValue(xFound,L"color"));

        CkXmlW_Dispose(xBeginAfter);
        xBeginAfter = xFound;
        xFound = CkXmlW_SearchForAttribute(xSearchRoot,xBeginAfter,L"fruit",L"color",L"*e");
    }

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

    CkXmlW_Dispose(xBeginAfter);

    wprintf(L"--------------------------\n");

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

    xBeginAfter = CkXmlW_GetSelf(xSearchRoot);
    xSearch = CkXmlW_GetSelf(xSearchRoot);

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

        wprintf(L"%s: %s\n",CkXmlW_content(xSearch),CkXmlW_getAttrValue(xSearch,L"color"));

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

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

    CkXmlW_Dispose(xSearch);
    CkXmlW_Dispose(xBeginAfter);

    CkXmlW_Dispose(xSearchRoot);


    CkXmlW_Dispose(xml);

    }