xref: /aosp_15_r20/external/libxml2/example/tree2.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
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