Sample code for 30+ languages & platforms
Delphi DLL

Demonstrate XML SearchForTag2

Demonstrates how to use SearchForTag2.

Chilkat Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, StringBuilder, Xml;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
xml: HCkXml;
i: Integer;
xmlSearch: HCkXml;
afterPtr: HCkXml;
pTemp: HCkXml;
sbState: HCkStringBuilder;

begin
success := False;

xml := CkXml_Create();

// Load the following XML:

// 	<Test>
// 	    <testchild1>
// 	        test
// 	    </testchild1>
// 	    <testchild1>
// 	        test1
// 	    </testchild1>
// 	    <testchild1>
// 	        test2
// 	    </testchild1>
// 	    <testchild1>
// 	        test3
// 	    </testchild1>
// 	    <testchild1>
// 	        test4
// 	    </testchild1>
// 	    <testchild1>
// 	        test5
// 	    </testchild1>
// 	    <testchild1>
// 	        test6
// 	    </testchild1>
// 	</Test>

success := CkXml_LoadXml(xml,'<Test><testchild1>test</testchild1><testchild1>test1</testchild1><testchild1>test2</testchild1><testchild1>test3</testchild1><testchild1>test4</testchild1><testchild1>test5</testchild1><testchild1>test6</testchild1></Test>');

i := 0;
xmlSearch := CkXml_GetRoot(xml);
afterPtr := CkXml_GetRoot(xml);

// Alway begin the search from the root.
while CkXml_SearchForTag2(xmlSearch,afterPtr,'testchild1') do
  begin
    // If successful, xmlSearch now points to the found element.
    i := i + 1;

    // Set afterPtr = xmlSearch (so we find the next match after the one we just found)
    // Rest xmlSearch to the root of the XML tree to be searched.
    Memo1.Lines.Add(IntToStr(i) + ': ' + CkXml__content(xmlSearch));
    pTemp := afterPtr;
    afterPtr := xmlSearch;
    CkXml_GetRoot2(pTemp);
    xmlSearch := pTemp;
  end;

CkXml_Dispose(xmlSearch);
CkXml_Dispose(afterPtr);

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

// A better way:
sbState := CkStringBuilder_Create();
i := 0;
while CkXml_NextInTraversal2(xml,sbState) <> False do
  begin
    if (CkXml_TagEquals(xml,'testchild1') = True) then
      begin
        Memo1.Lines.Add(IntToStr(i) + ': ' + CkXml__content(xml));
        i := i + 1;
      end;
  end;

CkXml_GetRoot2(xml);

CkXml_Dispose(xml);
CkStringBuilder_Dispose(sbState);

end;