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