diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2015-10-19 15:37:26 +0300 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2015-10-19 15:37:26 +0300 |
commit | 6c6e567eb34ad0f5a3bd90f6585c521543106401 (patch) | |
tree | 7f8dc62f12dd2b720ffdc738d393cd1a8f82921c /doc/examples/tree2.c | |
parent | 7421ae696c1ef2fb48adc73ba8564ef2f276d618 (diff) | |
parent | 218d404f34d79a8837f9c0230dd9d9f1180b4068 (diff) | |
download | libxml2-pristine-tar.tar.gz |
Merge branch 'pristine-tar' of git://anonscm.debian.org/debian-xml-sgml/libxml2 into pristine-tarpristine-tar
Diffstat (limited to 'doc/examples/tree2.c')
-rw-r--r-- | doc/examples/tree2.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/doc/examples/tree2.c b/doc/examples/tree2.c new file mode 100644 index 0000000..1cd1abe --- /dev/null +++ b/doc/examples/tree2.c @@ -0,0 +1,118 @@ +/* + * section: Tree + * synopsis: Creates a tree + * purpose: Shows how to create document, nodes and dump it to stdout or file. + * usage: tree2 <filename> -Default output: stdout + * test: tree2 > tree2.tmp && diff tree2.tmp $(srcdir)/tree2.res + * author: Lucas Brasilino <brasilino@recife.pe.gov.br> + * copy: see Copyright for the status of this software + */ + +#include <stdio.h> +#include <libxml/parser.h> +#include <libxml/tree.h> + +#if defined(LIBXML_TREE_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) + +/* + *To compile this file using gcc you can type + *gcc `xml2-config --cflags --libs` -o tree2 tree2.c + */ + +/* A simple example how to create DOM. Libxml2 automagically + * allocates the necessary amount of memory to it. +*/ +int +main(int argc, char **argv) +{ + xmlDocPtr doc = NULL; /* document pointer */ + xmlNodePtr root_node = NULL, node = NULL, node1 = NULL;/* node pointers */ + xmlDtdPtr dtd = NULL; /* DTD pointer */ + char buff[256]; + int i, j; + + LIBXML_TEST_VERSION; + + /* + * Creates a new document, a node and set it as a root node + */ + doc = xmlNewDoc(BAD_CAST "1.0"); + root_node = xmlNewNode(NULL, BAD_CAST "root"); + xmlDocSetRootElement(doc, root_node); + + /* + * Creates a DTD declaration. Isn't mandatory. + */ + dtd = xmlCreateIntSubset(doc, BAD_CAST "root", NULL, BAD_CAST "tree2.dtd"); + + /* + * xmlNewChild() creates a new node, which is "attached" as child node + * of root_node node. + */ + xmlNewChild(root_node, NULL, BAD_CAST "node1", + BAD_CAST "content of node 1"); + /* + * The same as above, but the new child node doesn't have a content + */ + xmlNewChild(root_node, NULL, BAD_CAST "node2", NULL); + + /* + * xmlNewProp() creates attributes, which is "attached" to an node. + * It returns xmlAttrPtr, which isn't used here. + */ + node = + xmlNewChild(root_node, NULL, BAD_CAST "node3", + BAD_CAST "this node has attributes"); + xmlNewProp(node, BAD_CAST "attribute", BAD_CAST "yes"); + xmlNewProp(node, BAD_CAST "foo", BAD_CAST "bar"); + + /* + * Here goes another way to create nodes. xmlNewNode() and xmlNewText + * creates a node and a text node separately. They are "attached" + * by xmlAddChild() + */ + node = xmlNewNode(NULL, BAD_CAST "node4"); + node1 = xmlNewText(BAD_CAST + "other way to create content (which is also a node)"); + xmlAddChild(node, node1); + xmlAddChild(root_node, node); + + /* + * A simple loop that "automates" nodes creation + */ + for (i = 5; i < 7; i++) { + sprintf(buff, "node%d", i); + node = xmlNewChild(root_node, NULL, BAD_CAST buff, NULL); + for (j = 1; j < 4; j++) { + sprintf(buff, "node%d%d", i, j); + node1 = xmlNewChild(node, NULL, BAD_CAST buff, NULL); + xmlNewProp(node1, BAD_CAST "odd", BAD_CAST((j % 2) ? "no" : "yes")); + } + } + + /* + * Dumping document to stdio or file + */ + xmlSaveFormatFileEnc(argc > 1 ? argv[1] : "-", doc, "UTF-8", 1); + + /*free the document */ + xmlFreeDoc(doc); + + /* + *Free the global variables that may + *have been allocated by the parser. + */ + xmlCleanupParser(); + + /* + * this is to debug memory for regression tests + */ + xmlMemoryDump(); + return(0); +} +#else +int main(void) { + fprintf(stderr, "tree support not compiled in\n"); + exit(1); +} +#endif |