xref: /aosp_15_r20/external/libxml2/example/tree1.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker /**
2*7c568831SAndroid Build Coastguard Worker  * section: Tree
3*7c568831SAndroid Build Coastguard Worker  * synopsis: Navigates a tree to print element names
4*7c568831SAndroid Build Coastguard Worker  * purpose: Parse a file to a tree, use xmlDocGetRootElement() to
5*7c568831SAndroid Build Coastguard Worker  *          get the root element, then walk the document and print
6*7c568831SAndroid Build Coastguard Worker  *          all the element name in document order.
7*7c568831SAndroid Build Coastguard Worker  * usage: tree1 filename_or_URL
8*7c568831SAndroid Build Coastguard Worker  * test: tree1 test2.xml > tree1.tmp && diff tree1.tmp $(srcdir)/tree1.res
9*7c568831SAndroid Build Coastguard Worker  * author: Dodji Seketeli
10*7c568831SAndroid Build Coastguard Worker  * copy: see Copyright for the status of this software.
11*7c568831SAndroid Build Coastguard Worker  */
12*7c568831SAndroid Build Coastguard Worker #include <stdio.h>
13*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
14*7c568831SAndroid Build Coastguard Worker #include <libxml/tree.h>
15*7c568831SAndroid Build Coastguard Worker 
16*7c568831SAndroid Build Coastguard Worker /*
17*7c568831SAndroid Build Coastguard Worker  *To compile this file using gcc you can type
18*7c568831SAndroid Build Coastguard Worker  *gcc `xml2-config --cflags --libs` -o xmlexample libxml2-example.c
19*7c568831SAndroid Build Coastguard Worker  */
20*7c568831SAndroid Build Coastguard Worker 
21*7c568831SAndroid Build Coastguard Worker /**
22*7c568831SAndroid Build Coastguard Worker  * print_element_names:
23*7c568831SAndroid Build Coastguard Worker  * @a_node: the initial xml node to consider.
24*7c568831SAndroid Build Coastguard Worker  *
25*7c568831SAndroid Build Coastguard Worker  * Prints the names of the all the xml elements
26*7c568831SAndroid Build Coastguard Worker  * that are siblings or children of a given xml node.
27*7c568831SAndroid Build Coastguard Worker  */
28*7c568831SAndroid Build Coastguard Worker static void
print_element_names(xmlNode * a_node)29*7c568831SAndroid Build Coastguard Worker print_element_names(xmlNode * a_node)
30*7c568831SAndroid Build Coastguard Worker {
31*7c568831SAndroid Build Coastguard Worker     xmlNode *cur_node = NULL;
32*7c568831SAndroid Build Coastguard Worker 
33*7c568831SAndroid Build Coastguard Worker     for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
34*7c568831SAndroid Build Coastguard Worker         if (cur_node->type == XML_ELEMENT_NODE) {
35*7c568831SAndroid Build Coastguard Worker             printf("node type: Element, name: %s\n", cur_node->name);
36*7c568831SAndroid Build Coastguard Worker         }
37*7c568831SAndroid Build Coastguard Worker 
38*7c568831SAndroid Build Coastguard Worker         print_element_names(cur_node->children);
39*7c568831SAndroid Build Coastguard Worker     }
40*7c568831SAndroid Build Coastguard Worker }
41*7c568831SAndroid Build Coastguard Worker 
42*7c568831SAndroid Build Coastguard Worker 
43*7c568831SAndroid Build Coastguard Worker /**
44*7c568831SAndroid Build Coastguard Worker  * Simple example to parse a file called "file.xml",
45*7c568831SAndroid Build Coastguard Worker  * walk down the DOM, and print the name of the
46*7c568831SAndroid Build Coastguard Worker  * xml elements nodes.
47*7c568831SAndroid Build Coastguard Worker  */
48*7c568831SAndroid Build Coastguard Worker int
main(int argc,char ** argv)49*7c568831SAndroid Build Coastguard Worker main(int argc, char **argv)
50*7c568831SAndroid Build Coastguard Worker {
51*7c568831SAndroid Build Coastguard Worker     xmlDoc *doc = NULL;
52*7c568831SAndroid Build Coastguard Worker     xmlNode *root_element = NULL;
53*7c568831SAndroid Build Coastguard Worker 
54*7c568831SAndroid Build Coastguard Worker     if (argc != 2)
55*7c568831SAndroid Build Coastguard Worker         return(1);
56*7c568831SAndroid Build Coastguard Worker 
57*7c568831SAndroid Build Coastguard Worker     /*
58*7c568831SAndroid Build Coastguard Worker      * this initialize the library and check potential ABI mismatches
59*7c568831SAndroid Build Coastguard Worker      * between the version it was compiled for and the actual shared
60*7c568831SAndroid Build Coastguard Worker      * library used.
61*7c568831SAndroid Build Coastguard Worker      */
62*7c568831SAndroid Build Coastguard Worker     LIBXML_TEST_VERSION
63*7c568831SAndroid Build Coastguard Worker 
64*7c568831SAndroid Build Coastguard Worker     /*parse the file and get the DOM */
65*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(argv[1], NULL, 0);
66*7c568831SAndroid Build Coastguard Worker 
67*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
68*7c568831SAndroid Build Coastguard Worker         printf("error: could not parse file %s\n", argv[1]);
69*7c568831SAndroid Build Coastguard Worker     }
70*7c568831SAndroid Build Coastguard Worker 
71*7c568831SAndroid Build Coastguard Worker     /*Get the root element node */
72*7c568831SAndroid Build Coastguard Worker     root_element = xmlDocGetRootElement(doc);
73*7c568831SAndroid Build Coastguard Worker 
74*7c568831SAndroid Build Coastguard Worker     print_element_names(root_element);
75*7c568831SAndroid Build Coastguard Worker 
76*7c568831SAndroid Build Coastguard Worker     /*free the document */
77*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
78*7c568831SAndroid Build Coastguard Worker 
79*7c568831SAndroid Build Coastguard Worker     return 0;
80*7c568831SAndroid Build Coastguard Worker }
81