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 <brasilino (at) recife.pe.gov.br> 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 118