fpc/packages/libxml/examples/reader1.pas
Michaël Van Canneyt 0ffc8de077 * PChar -> PAnsichar
2023-07-15 18:22:37 +02:00

99 lines
2.2 KiB
ObjectPascal

(**
* section: xmlReader
* synopsis: Parse an XML file with an xmlReader
* purpose: Demonstrate the use of xmlReaderForFile() to parse an XML file
* and dump the informations about the nodes found in the process.
* (Note that the XMLReader functions require libxml2 version later
* than 2.6.)
* usage: reader1 <filename>
* test: reader1 test2.xml > reader1.tmp ; diff reader1.tmp reader1.res ; rm reader1.tmp
* author: Daniel Veillard
* copy: see Copyright for the status of this software.
*)
program reader1;
{$mode objfpc}
uses
ctypes,
xml2,
exutils;
(**
* processNode:
* @reader: the xmlReader
*
* Dump information about the current node
*)
procedure processNode(reader: xmlTextReaderPtr);
var
value, name: xmlCharPtr;
begin
name := xmlTextReaderConstName(reader);
if not assigned(name) then
name := '--';
value := xmlTextReaderConstValue(reader);
printf('%d %d %s %d %d',
[xmlTextReaderDepth(reader),
xmlTextReaderNodeType(reader),
name,
xmlTextReaderIsEmptyElement(reader),
xmlTextReaderHasValue(reader)]);
if not assigned(value) then
writeln
else
if (xmlStrlen(value) > 40) then
printfn(' %.40s...\n', [value])
else
printfn(' %s\n', [value]);
end;
(**
* streamFile:
* @filename: the file name to parse
*
* Parse and print information about an XML file.
*)
procedure streamFile(const filename: PAnsiChar);
var
reader: xmlTextReaderPtr;
ret: cint;
begin
reader := xmlReaderForFile(filename, nil, 0);
if assigned(reader) then
begin
ret := xmlTextReaderRead(reader);
while ret = 1 do
begin
processNode(reader);
ret := xmlTextReaderRead(reader);
end;
xmlFreeTextReader(reader);
if ret <> 0 then
printfn('%s : failed to parse', [filename]);
end else
printfn('Unable to open %s', [filename]);
end;
begin
(*
* this initialize the library and check potential ABI mismatches
* between the version it was compiled for and the actual shared
* library used.
*)
LIBXML_TEST_VERSION;
streamFile(PAnsiChar(ParamStr(1)));
(*
* Cleanup function for the XML library.
*)
xmlCleanupParser();
end.