Home | History | Annotate | Download | only in examples
      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     xmlDtdPtr dtd = NULL;       /* DTD pointer */
     31     char buff[256];
     32     int i, j;
     33 
     34     LIBXML_TEST_VERSION;
     35 
     36     /*
     37      * Creates a new document, a node and set it as a root node
     38      */
     39     doc = xmlNewDoc(BAD_CAST "1.0");
     40     root_node = xmlNewNode(NULL, BAD_CAST "root");
     41     xmlDocSetRootElement(doc, root_node);
     42 
     43     /*
     44      * Creates a DTD declaration. Isn't mandatory.
     45      */
     46     dtd = xmlCreateIntSubset(doc, BAD_CAST "root", NULL, BAD_CAST "tree2.dtd");
     47 
     48     /*
     49      * xmlNewChild() creates a new node, which is "attached" as child node
     50      * of root_node node.
     51      */
     52     xmlNewChild(root_node, NULL, BAD_CAST "node1",
     53                 BAD_CAST "content of node 1");
     54     /*
     55      * The same as above, but the new child node doesn't have a content
     56      */
     57     xmlNewChild(root_node, NULL, BAD_CAST "node2", NULL);
     58 
     59     /*
     60      * xmlNewProp() creates attributes, which is "attached" to an node.
     61      * It returns xmlAttrPtr, which isn't used here.
     62      */
     63     node =
     64         xmlNewChild(root_node, NULL, BAD_CAST "node3",
     65                     BAD_CAST "this node has attributes");
     66     xmlNewProp(node, BAD_CAST "attribute", BAD_CAST "yes");
     67     xmlNewProp(node, BAD_CAST "foo", BAD_CAST "bar");
     68 
     69     /*
     70      * Here goes another way to create nodes. xmlNewNode() and xmlNewText
     71      * creates a node and a text node separately. They are "attached"
     72      * by xmlAddChild()
     73      */
     74     node = xmlNewNode(NULL, BAD_CAST "node4");
     75     node1 = xmlNewText(BAD_CAST
     76                    "other way to create content (which is also a node)");
     77     xmlAddChild(node, node1);
     78     xmlAddChild(root_node, node);
     79 
     80     /*
     81      * A simple loop that "automates" nodes creation
     82      */
     83     for (i = 5; i < 7; i++) {
     84         sprintf(buff, "node%d", i);
     85         node = xmlNewChild(root_node, NULL, BAD_CAST buff, NULL);
     86         for (j = 1; j < 4; j++) {
     87             sprintf(buff, "node%d%d", i, j);
     88             node1 = xmlNewChild(node, NULL, BAD_CAST buff, NULL);
     89             xmlNewProp(node1, BAD_CAST "odd", BAD_CAST((j % 2) ? "no" : "yes"));
     90         }
     91     }
     92 
     93     /*
     94      * Dumping document to stdio or file
     95      */
     96     xmlSaveFormatFileEnc(argc > 1 ? argv[1] : "-", doc, "UTF-8", 1);
     97 
     98     /*free the document */
     99     xmlFreeDoc(doc);
    100 
    101     /*
    102      *Free the global variables that may
    103      *have been allocated by the parser.
    104      */
    105     xmlCleanupParser();
    106 
    107     /*
    108      * this is to debug memory for regression tests
    109      */
    110     xmlMemoryDump();
    111     return(0);
    112 }
    113 #else
    114 int main(void) {
    115     fprintf(stderr, "tree support not compiled in\n");
    116     exit(1);
    117 }
    118 #endif
    119