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

111 lines
2.6 KiB
ObjectPascal

(*
* section: Tree
* synopsis: Creates a tree
* purpose: Shows how to create document, nodes and dump it to stdout or file.
* usage: tree2 <filename> -Default output: stdout
* test: tree2 > tree2.tmp ; diff tree2.tmp tree2.res ; rm tree2.tmp
* author: Lucas Brasilino <brasilino@recife.pe.gov.br>
* copy: see Copyright for the status of this software
*)
program tree2;
{$mode objfpc}
uses
ctypes,
xml2,
exutils,
SysUtils;
var
doc: xmlDocPtr;
root_node, node, node1: xmlNodePtr;
dtd: xmlDtdPtr;
buff: array[0..255] of AnsiChar;
i, j: cint;
begin
LIBXML_TEST_VERSION;
(*
* Creates a new document, a node and set it as a root node
*)
doc := xmlNewDoc('1.0');
root_node := xmlNewNode(nil, 'root');
xmlDocSetRootElement(doc, root_node);
(*
* Creates a DTD declaration. Isn't mandatory.
*)
dtd := xmlCreateIntSubset(doc, 'root', nil, 'tree2.dtd');
(*
* xmlNewChild() creates a new node, which is "attached" as child node
* of root_node node.
*)
xmlNewChild(root_node, nil, 'node1', 'content of node 1');
(*
* The same as above, but the new child node doesn't have a content
*)
xmlNewChild(root_node, nil, 'node2', nil);
(*
* xmlNewProp() creates attributes, which is "attached" to an node.
* It returns xmlAttrPtr, which isn't used here.
*)
node := xmlNewChild(root_node, nil, 'node3', 'this node has attributes');
xmlNewProp(node, 'attribute', 'yes');
xmlNewProp(node, 'foo', 'bar');
(*
* Here goes another way to create nodes. xmlNewNode() and xmlNewText
* creates a node and a text node separately. They are "attached"
* by xmlAddChild()
*)
node := xmlNewNode(nil, 'node4');
node1 := xmlNewText('other way to create content (which is also a node)');
xmlAddChild(node, node1);
xmlAddChild(root_node, node);
(*
* A simple loop that "automates" nodes creation
*)
for i := 5 to 6 do
begin
buff := 'node'+inttostr(i);
node := xmlNewChild(root_node, nil, buff, nil);
for j := 1 to 3 do
begin
buff := 'node'+inttostr(i)+inttostr(j);
node1 := xmlNewChild(node, nil, buff, nil);
if j mod 2 = 0 then
xmlNewProp(node1, 'odd', 'no')
else
xmlNewProp(node1, 'odd', 'yes');
end;
end;
(*
* Dumping document to stdio or file
*)
docdump(doc);
//xmlSaveFormatFileEnc(argc > 1 ? argv[1] : "-", doc, "UTF-8", 1);
(*free the document *)
xmlFreeDoc(doc);
(*
* Free the global variables that may
* have been allocated by the parser.
*)
xmlCleanupParser();
(*
* this is to debug memory for regression tests
*)
xmlMemoryDump();
end.