We are going to parse an XML sample file and print the data to stdout.
Like all examples we start by including Eina:
We declare 2 booleans to keep track of tags:
#define EINA_FALSE
boolean value FALSE (numerical value 0)
Definition eina_types.h:293
unsigned char Eina_Bool
Type to mimic a boolean.
Definition eina_types.h:287
Here we declare some variables and initialize eina:
int
main(void)
{
FILE *file;
long size;
char *buffer;
int eina_init(void)
Initialize the Eina library.
Definition eina_main.c:244
Type for an array of data.
Definition eina_array.h:233
We fill buffer with the XML data from chat.xml:
if ((file = fopen("chat.xml", "rb")))
{
fseek(file, 0, SEEK_END);
size = ftell(file);
fseek(file, 0, SEEK_SET);
if ((buffer = malloc(size)))
{
fread(buffer, 1, size, file);
We will use an Eina_Array to store the data:
Eina_Array * eina_array_new(unsigned int step)
Create a new array.
Definition eina_array.c:265
Here we call eina_simple_xml_parse(). We pass the buffer with data, its size, we ask to strip leading and trailing whitespace, we give the callback function and the array to store the formatted data:
_xml_tag_cb, array);
Eina_Bool eina_simple_xml_parse(const char *buf, unsigned buflen, Eina_Bool strip, Eina_Simple_XML_Cb func, const void *data)
Parse a section of XML string text.
Definition eina_simple_xml_parser.c:289
#define EINA_TRUE
boolean value TRUE (numerical value 1)
Definition eina_types.h:299
This will loop over the array and print the data using _print callback:
static Eina_Bool eina_array_foreach(Eina_Array *array, Eina_Each_Cb cb, void *fdata)
Provide a safe way to iterate over an array.
This is the main XML parser callback, it will check for known tags and get the corresponding values:
_xml_tag_cb(void *data, Eina_Simple_XML_Type type, const char *content,
unsigned offset, unsigned length)
{
char buffer[length+1];
char str[512];
We first check for opening tag:
@ EINA_SIMPLE_XML_OPEN
Definition eina_simple_xml_parser.h:202
If we know the tag should have attributes, then we find them using eina_simple_xml_tag_attributes_find() and give them to another parsing function using eina_simple_xml_attributes_parse():
{
if(!strncmp("post", content, strlen("post")))
{
length);
_xml_attr_cb, str);
const char * eina_simple_xml_tag_attributes_find(const char *buf, unsigned buflen)
Given the contents of a tag, find where the attributes start.
Definition eina_simple_xml_parser.c:473
Eina_Bool eina_simple_xml_attributes_parse(const char *buf, unsigned buflen, Eina_Simple_XML_Attribute_Cb func, const void *data)
Given a buffer with xml attributes, parse them to key=value pairs.
Definition eina_simple_xml_parser.c:498
We check for other known tags:
}
else if (!strncmp("login>", content, strlen("login>")))
{
}
else if (!strncmp("message>", content, strlen("message>")))
{
We then check data for corresponding tag:
}
}
{
{
snprintf(buffer, sizeof(buffer), content);
strncat(str, "<", 1);
strncat(str, buffer, sizeof(buffer));
strncat(str, "> ", 2);
@ EINA_SIMPLE_XML_DATA
Definition eina_simple_xml_parser.h:205
We are doing the formatting in same time and put all the <post> children in str.
}
{
snprintf(buffer, sizeof(buffer), content);
strncat(str, buffer, sizeof(buffer));
Finally, we store our string in the array:
eina_array_push(array, strdup(str));
This is the callback to parse the attributes, we check for key name and keep the value:
_xml_attr_cb(void *data, const char *key, const char *value)
{
char *str = data;
if(!strcmp("id", key))
{
snprintf(str, sizeof(value) + 3, "(%s) ", value);
This is the function that simply print items of the array:
You can see the full source code here.