Sample code for 30+ languages & platforms
Delphi ActiveX

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 Delphi ActiveX Downloads

Delphi ActiveX
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Chilkat_TLB;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Integer;
xml: TChilkatXml;
xSearchRoot: IChilkatXml;
xBeginAfter: IChilkatXml;
xFound: IChilkatXml;
xSearch: IChilkatXml;

begin
success := 0;

xml := TChilkatXml.Create(Self);

success := xml.LoadXmlFile('qa_data/xml/fruitSearch.xml');
if (success <> 1) then
  begin
    Memo1.Lines.Add(xml.LastErrorText);
    Exit;
  end;

// Search the sub-tree rooted at "searchRoot"
xSearchRoot := xml.FindChild('searchRoot');
if (xml.LastMethodSuccess = 0) then
  begin
    Memo1.Lines.Add('searchRoot not found, searching from root.');
    xSearchRoot := xml.GetRoot();
  end;

// Search for all "fruit" nodes having a color attribute
// where the name of the color ends in "e"
xBeginAfter := xSearchRoot.GetSelf();
xFound := xSearchRoot.SearchForAttribute(xBeginAfter,'fruit','color','*e');
while (xSearchRoot.LastMethodSuccess = 1) do
  begin

    Memo1.Lines.Add(xFound.Content + ': ' + xFound.GetAttrValue('color'));

    xBeginAfter := xFound;
    xFound := xSearchRoot.SearchForAttribute(xBeginAfter,'fruit','color','*e');
  end;

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

Memo1.Lines.Add('--------------------------');

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

xBeginAfter := xSearchRoot.GetSelf();
xSearch := xSearchRoot.GetSelf();

success := xSearch.SearchForAttribute2(xBeginAfter,'fruit','color','*e');
while success = 1 do
  begin

    Memo1.Lines.Add(xSearch.Content + ': ' + xSearch.GetAttrValue('color'));

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

    success := xSearch.SearchForAttribute2(xBeginAfter,'fruit','color','*e');
  end;
end;