- Notifications
You must be signed in to change notification settings - Fork69
Simple XML subset parser comparable to glib's Markup parser, but without any dependencies in one self contained file.
License
ooxi/xml.c
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Similar to theGLib Markup parser,which also just parses an xml subset,xml.c isa simple, small and self contained xml parser in one file. Ideal for embeddinginto other projects without the need for big external dependencies.
All releases are based on master, so the preferred way of using xml.c is addingthe repository asgit submodule.
If you prefer formal releases, check out therelease tags.
Since xml.c usesCMake, building the library is fairlyeasy
$ git clone https://github.com/ooxi/xml.c.git xml.c$ mkdir xml.c/build; cd xml.c/build$ cmake -DCMAKE_BUILD_TYPE=Release ..$ make && make test
If you need a debug build, specifyCMAKE_BUILD_TYPE
asDebug
and rebuild.
This example is alsoincluded in the repositoryand will be build by default. Most of the code is C boilerplate, the importantfunctions arexml_parse_document
,xml_document_root
,xml_node_name
,xml_node_content
andxml_node_child
/xml_node_children
.
#include<stdbool.h>#include<stdio.h>#include<stdlib.h>#include<xml.h>intmain(intargc,char**argv) {/* XML source, could be read from disk */uint8_t*source="""<Root>""<Hello>World</Hello>""<This>""<Is>:-)</Is>""<An>:-O</An>""<Example>:-D</Example>""</This>""</Root>";/* Parse the document * * Watch out: Remember not to free the source until you have freed the * document itself. If you have to free the source before, supply a * copy to xml_parse_document which can be freed together with the * document (`free_buffer' argument to `xml_document_free') */structxml_document*document=xml_parse_document(source,strlen(source));/* You _have_ to check the result of `xml_parse_document', if it's 0 * then the source could not be parsed. If you think this is a bug in * xml.c, then use a debug build (cmake -DCMAKE_BUILD_TYPE=Debug) which * will verbosely tell you about the parsing process */if (!document) {printf("Could parse document\n");exit(EXIT_FAILURE);}structxml_node*root=xml_document_root(document);/* Say Hello World :-) */structxml_node*root_hello=xml_node_child(root,0);structxml_string*hello=xml_node_name(root_hello);structxml_string*world=xml_node_content(root_hello);/* Watch out: `xml_string_copy' will not 0-terminate your buffers! (but * `calloc' will :-) */uint8_t*hello_0=calloc(xml_string_length(hello)+1,sizeof(uint8_t));uint8_t*world_0=calloc(xml_string_length(world)+1,sizeof(uint8_t));xml_string_copy(hello,hello_0,xml_string_length(hello));xml_string_copy(world,world_0,xml_string_length(world));printf("%s %s\n",hello_0,world_0);free(hello_0);free(world_0);/* Extract amount of Root/This children */structxml_node*root_this=xml_node_child(root,1);printf("Root/This has %lu children\n", (unsigned long)xml_node_children(root_this));/* Remember to free the document or you'll risk a memory leak */xml_document_free(document, false);}
Another usage example can be found in theunit case.
libpng/zlib (BSD)
About
Simple XML subset parser comparable to glib's Markup parser, but without any dependencies in one self contained file.