Sample code for 30+ languages & platforms
Delphi ActiveX

Traverse Direct Children via FirstChild / NextSibling, or LastChild / PreviousSibling

See more XML Examples

Demonstrates some ways to iterate over direct child nodes using the FirstChild / NextSibling and LastChild / PreviousSibling methods.

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

<root>
    <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>
</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;
child: IChilkatXml;
nextSibling: IChilkatXml;
prevSibling: IChilkatXml;
bContinue: Integer;

begin
success := 0;

xml := TChilkatXml.Create(Self);

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

// Iterate over the direct children by using FirstChild / NextSibling
child := xml.FirstChild();
bContinue := xml.LastMethodSuccess;
while (bContinue = 1) do
  begin
    Memo1.Lines.Add(child.Tag + ' : ' + child.Content);
    nextSibling := child.NextSibling();
    bContinue := child.LastMethodSuccess;

    child := nextSibling;
  end;

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

// Do the same, but with FirstChild2 / NextSibling2 to avoid
// creating so many XML object instances:
success := xml.FirstChild2();
while success = 1 do
  begin
    Memo1.Lines.Add(xml.Tag + ' : ' + xml.Content);
    success := xml.NextSibling2();
  end;

// Revert back up to the parent:
success := xml.GetParent2();

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

// Iterate in reverse order using LastChild / PreviousSibling
child := xml.LastChild();
bContinue := xml.LastMethodSuccess;
while (bContinue = 1) do
  begin
    Memo1.Lines.Add(child.Tag + ' : ' + child.Content);
    prevSibling := child.PreviousSibling();
    bContinue := child.LastMethodSuccess;

    child := prevSibling;
  end;

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

// Do the same, but with LastChild2 / PreviousSibling2 to avoid
// creating so many XML object instances:
success := xml.LastChild2();
while success = 1 do
  begin
    Memo1.Lines.Add(xml.Tag + ' : ' + xml.Content);
    success := xml.PreviousSibling2();
  end;

// Revert back up to the parent:
success := xml.GetParent2();
end;