mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-09 08:30:54 +02:00
111 lines
2.6 KiB
ObjectPascal
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.
|