Sample code for 30+ languages & platforms
Lua

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 Lua Downloads

Lua
local chilkat = require("chilkat")

local xml = chilkat.Xml.new()

local success = xml:load_xml_file("qa_data/xml/fruitSearch.xml")
if not success then
    print(xml.last_error_text)
    return
end

-- Search the sub-tree rooted at "searchRoot";
local xSearchRoot = xml:find_child("searchRoot")
if not xml.last_method_success then
    print("searchRoot not found, searching from root.")
    xSearchRoot = xml:get_root()
end

-- Search for all "fruit" nodes having a color attribute
-- where the name of the color ends in "e";
local xBeginAfter = xSearchRoot:get_self()
local xFound = xSearchRoot:search_for_attribute(xBeginAfter, "fruit", "color", "*e")
while xSearchRoot.last_method_success do
    print(xFound.content .. ": " .. xFound:get_attr_value("color"))

    xBeginAfter = xFound
    xFound = xSearchRoot:search_for_attribute(xBeginAfter, "fruit", "color", "*e")
end

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

print("--------------------------")

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

xBeginAfter = xSearchRoot:get_self()
local xSearch = xSearchRoot:get_self()

success = xSearch:search_for_attribute2(xBeginAfter, "fruit", "color", "*e")
while success do
    print(xSearch.content .. ": " .. xSearch:get_attr_value("color"))

    -- Copy the internal references so that the next search
    -- begins after the found node.
    xBeginAfter:copy_ref(xSearch)
    xSearch:copy_ref(xSearchRoot)

    success = xSearch:search_for_attribute2(xBeginAfter, "fruit", "color", "*e")
end