Pascal (Lazarus/Delphi)
Pascal (Lazarus/Delphi)
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 Pascal (Lazarus/Delphi) Downloads
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;
xSearchRoot: TXml;
xBeginAfter: TXml;
xFound: TXml;
xSearch: TXml;
begin
success := False;
xml := TXml.Create;
success := xml.LoadXmlFile('qa_data/xml/fruitSearch.xml');
if (success <> True) then
begin
WriteLn(xml.LastErrorText);
Exit;
end;
// Search the sub-tree rooted at "searchRoot";
xSearchRoot := xml.FindChild('searchRoot');
if (xml.LastMethodSuccess = False) then
begin
WriteLn('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 = True) do
begin
WriteLn(xFound.Content + ': ' + xFound.GetAttrValue('color'));
xBeginAfter.Free;
xBeginAfter := xFound;
xFound := xSearchRoot.SearchForAttribute(xBeginAfter,'fruit','color','*e');
end;
// The correct output is:
// grape: purple
// blueberry: blue
xBeginAfter.Free;
WriteLn('--------------------------');
// ---------------------------------------------------------------------------------
// 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 = True do
begin
WriteLn(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;
xSearch.Free;
xBeginAfter.Free;
xSearchRoot.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.