1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker * section: Tree
3*7c568831SAndroid Build Coastguard Worker * synopsis: Creates a tree
4*7c568831SAndroid Build Coastguard Worker * purpose: Shows how to create document, nodes and dump it to stdout or file.
5*7c568831SAndroid Build Coastguard Worker * usage: tree2 <filename> -Default output: stdout
6*7c568831SAndroid Build Coastguard Worker * test: tree2 > tree2.tmp && diff tree2.tmp $(srcdir)/tree2.res
7*7c568831SAndroid Build Coastguard Worker * author: Lucas Brasilino <[email protected]>
8*7c568831SAndroid Build Coastguard Worker * copy: see Copyright for the status of this software
9*7c568831SAndroid Build Coastguard Worker */
10*7c568831SAndroid Build Coastguard Worker
11*7c568831SAndroid Build Coastguard Worker #include <stdio.h>
12*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
13*7c568831SAndroid Build Coastguard Worker #include <libxml/tree.h>
14*7c568831SAndroid Build Coastguard Worker
15*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_OUTPUT_ENABLED)
16*7c568831SAndroid Build Coastguard Worker
17*7c568831SAndroid Build Coastguard Worker /*
18*7c568831SAndroid Build Coastguard Worker *To compile this file using gcc you can type
19*7c568831SAndroid Build Coastguard Worker *gcc `xml2-config --cflags --libs` -o tree2 tree2.c
20*7c568831SAndroid Build Coastguard Worker */
21*7c568831SAndroid Build Coastguard Worker
22*7c568831SAndroid Build Coastguard Worker /* A simple example how to create DOM. Libxml2 automagically
23*7c568831SAndroid Build Coastguard Worker * allocates the necessary amount of memory to it.
24*7c568831SAndroid Build Coastguard Worker */
25*7c568831SAndroid Build Coastguard Worker int
main(int argc,char ** argv)26*7c568831SAndroid Build Coastguard Worker main(int argc, char **argv)
27*7c568831SAndroid Build Coastguard Worker {
28*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc = NULL; /* document pointer */
29*7c568831SAndroid Build Coastguard Worker xmlNodePtr root_node = NULL, node = NULL, node1 = NULL;/* node pointers */
30*7c568831SAndroid Build Coastguard Worker char buff[256];
31*7c568831SAndroid Build Coastguard Worker int i, j;
32*7c568831SAndroid Build Coastguard Worker
33*7c568831SAndroid Build Coastguard Worker LIBXML_TEST_VERSION;
34*7c568831SAndroid Build Coastguard Worker
35*7c568831SAndroid Build Coastguard Worker /*
36*7c568831SAndroid Build Coastguard Worker * Creates a new document, a node and set it as a root node
37*7c568831SAndroid Build Coastguard Worker */
38*7c568831SAndroid Build Coastguard Worker doc = xmlNewDoc(BAD_CAST "1.0");
39*7c568831SAndroid Build Coastguard Worker root_node = xmlNewDocNode(doc, NULL, BAD_CAST "root", NULL);
40*7c568831SAndroid Build Coastguard Worker xmlDocSetRootElement(doc, root_node);
41*7c568831SAndroid Build Coastguard Worker
42*7c568831SAndroid Build Coastguard Worker /*
43*7c568831SAndroid Build Coastguard Worker * Creates a DTD declaration. Isn't mandatory.
44*7c568831SAndroid Build Coastguard Worker */
45*7c568831SAndroid Build Coastguard Worker xmlCreateIntSubset(doc, BAD_CAST "root", NULL, BAD_CAST "tree2.dtd");
46*7c568831SAndroid Build Coastguard Worker
47*7c568831SAndroid Build Coastguard Worker /*
48*7c568831SAndroid Build Coastguard Worker * xmlNewChild() creates a new node, which is "attached" as child node
49*7c568831SAndroid Build Coastguard Worker * of root_node node.
50*7c568831SAndroid Build Coastguard Worker */
51*7c568831SAndroid Build Coastguard Worker xmlNewChild(root_node, NULL, BAD_CAST "node1",
52*7c568831SAndroid Build Coastguard Worker BAD_CAST "content of node 1");
53*7c568831SAndroid Build Coastguard Worker /*
54*7c568831SAndroid Build Coastguard Worker * The same as above, but the new child node doesn't have a content
55*7c568831SAndroid Build Coastguard Worker */
56*7c568831SAndroid Build Coastguard Worker xmlNewChild(root_node, NULL, BAD_CAST "node2", NULL);
57*7c568831SAndroid Build Coastguard Worker
58*7c568831SAndroid Build Coastguard Worker /*
59*7c568831SAndroid Build Coastguard Worker * xmlNewProp() creates attributes, which is "attached" to an node.
60*7c568831SAndroid Build Coastguard Worker * It returns xmlAttrPtr, which isn't used here.
61*7c568831SAndroid Build Coastguard Worker */
62*7c568831SAndroid Build Coastguard Worker node =
63*7c568831SAndroid Build Coastguard Worker xmlNewChild(root_node, NULL, BAD_CAST "node3",
64*7c568831SAndroid Build Coastguard Worker BAD_CAST "this node has attributes");
65*7c568831SAndroid Build Coastguard Worker xmlNewProp(node, BAD_CAST "attribute", BAD_CAST "yes");
66*7c568831SAndroid Build Coastguard Worker xmlNewProp(node, BAD_CAST "foo", BAD_CAST "bar");
67*7c568831SAndroid Build Coastguard Worker
68*7c568831SAndroid Build Coastguard Worker /*
69*7c568831SAndroid Build Coastguard Worker * Here goes another way to create nodes. xmlNewNode() and xmlNewText
70*7c568831SAndroid Build Coastguard Worker * creates a node and a text node separately. They are "attached"
71*7c568831SAndroid Build Coastguard Worker * by xmlAddChild()
72*7c568831SAndroid Build Coastguard Worker */
73*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNode(doc, NULL, BAD_CAST "node4", NULL);
74*7c568831SAndroid Build Coastguard Worker node1 = xmlNewDocText(doc, BAD_CAST
75*7c568831SAndroid Build Coastguard Worker "other way to create content (which is also a node)");
76*7c568831SAndroid Build Coastguard Worker xmlAddChild(node, node1);
77*7c568831SAndroid Build Coastguard Worker xmlAddChild(root_node, node);
78*7c568831SAndroid Build Coastguard Worker
79*7c568831SAndroid Build Coastguard Worker /*
80*7c568831SAndroid Build Coastguard Worker * A simple loop that "automates" nodes creation
81*7c568831SAndroid Build Coastguard Worker */
82*7c568831SAndroid Build Coastguard Worker for (i = 5; i < 7; i++) {
83*7c568831SAndroid Build Coastguard Worker snprintf(buff, sizeof(buff), "node%d", i);
84*7c568831SAndroid Build Coastguard Worker node = xmlNewChild(root_node, NULL, BAD_CAST buff, NULL);
85*7c568831SAndroid Build Coastguard Worker for (j = 1; j < 4; j++) {
86*7c568831SAndroid Build Coastguard Worker snprintf(buff, sizeof(buff), "node%d%d", i, j);
87*7c568831SAndroid Build Coastguard Worker node1 = xmlNewChild(node, NULL, BAD_CAST buff, NULL);
88*7c568831SAndroid Build Coastguard Worker xmlNewProp(node1, BAD_CAST "odd", BAD_CAST((j % 2) ? "no" : "yes"));
89*7c568831SAndroid Build Coastguard Worker }
90*7c568831SAndroid Build Coastguard Worker }
91*7c568831SAndroid Build Coastguard Worker
92*7c568831SAndroid Build Coastguard Worker /*
93*7c568831SAndroid Build Coastguard Worker * Dumping document to stdio or file
94*7c568831SAndroid Build Coastguard Worker */
95*7c568831SAndroid Build Coastguard Worker xmlSaveFormatFileEnc(argc > 1 ? argv[1] : "-", doc, "UTF-8", 1);
96*7c568831SAndroid Build Coastguard Worker
97*7c568831SAndroid Build Coastguard Worker /*free the document */
98*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
99*7c568831SAndroid Build Coastguard Worker
100*7c568831SAndroid Build Coastguard Worker return(0);
101*7c568831SAndroid Build Coastguard Worker }
102*7c568831SAndroid Build Coastguard Worker #else
main(void)103*7c568831SAndroid Build Coastguard Worker int main(void) {
104*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "output support not compiled in\n");
105*7c568831SAndroid Build Coastguard Worker return(0);
106*7c568831SAndroid Build Coastguard Worker }
107*7c568831SAndroid Build Coastguard Worker #endif
108