Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

XML Tree Traversal Order for Search* Methods

See more XML Examples

The Chilkat XML API provides a number of Search* methods for locating XML nodes based on criteria. These methods traverse an XML document in a breadth-first order. (See Breadth-First Search).

The XML document used in this example has the following tree structure:

The nodes are traversed in the order: A, B, C, D, E, F, G, H, I, J, K.

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

<a>crocodileA
    <b>crocodileB
        <d>crocodileD</d>
        <e>crocodileE
            <h>crocodileH</h>
            <i>crocodileI</i>
        </e>
    </b>
    <c>crocodileC
        <f>crocodileF</f>
        <g>crocodileG
            <j>crocodileJ</j>
            <k>crocodileK</k>
        </g>
    </c>
</a>

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Xml;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  xml: TXml;
  xBeginAfter: TXml;
  xFound: TXml;

begin
  success := False;

  xml := TXml.Create;

  //  The sample input XML is available at http://www.chilkatsoft.com/data/searchOrder.xml
  success := xml.LoadXmlFile('searchOrder.xml');
  if (success <> True) then
    begin
      WriteLn(xml.LastErrorText);
      Exit;
    end;

  //  IMPORTANT:  The following loop for iterating over all 
  //  matching nodes performs reasonably well for small to 
  //  mid-size XML documents or sub-trees.  Performance
  //  can be poor when the sub-tree contains many thousands
  //  of nodes (or more).

  //  NOTE:  The search is always rooted at the calling node.
  //  In this example, it happens to also be the root node of the entire
  //  XML document.  Searches can be performed on sub-trees
  //  within the document by calling the Search* method from
  //  the root node of a sub-tree.

  //  Demonstrate the breadth-first traversal:
  xBeginAfter := xml.GetSelf();
  xFound := xml.SearchAllForContent(xBeginAfter,'*croc*');
  while (xml.LastMethodSuccess = True) do
    begin

      WriteLn(xFound.Tag);

      xBeginAfter.Free;
      xBeginAfter := xFound;
      xFound := xml.SearchAllForContent(xBeginAfter,'*croc*');
    end;

  xBeginAfter.Free;


  xml.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.