fc0b771cdf
the node cache prevents recursively walking the xml tree over and over again to find the specified nodes.
188 lines
5.9 KiB
C
188 lines
5.9 KiB
C
#include <stdio.h>
|
|
#include <malloc.h>
|
|
#include <assert.h>
|
|
#include "xml.h"
|
|
|
|
#define ROOTNODE "/Configuration/output/menu"
|
|
#define LEAFNODE "name"
|
|
#define PATH ROOTNODE"/"LEAFNODE
|
|
#define BUFLEN 4096
|
|
|
|
#define PRINT_ERROR_AND_EXIT(id) \
|
|
if (xmlErrorGetNo(id, 0) != XML_NO_ERROR) { \
|
|
const char *errstr = xmlErrorGetString(id, 0); \
|
|
size_t column = xmlErrorGetColumnNo(id, 0); \
|
|
size_t lineno = xmlErrorGetLineNo(id, 1); \
|
|
printf("Error at line %i, column %i: %s\n", lineno, column, errstr); \
|
|
exit(-1); \
|
|
}
|
|
|
|
int main()
|
|
{
|
|
void *root_id;
|
|
|
|
root_id = xmlOpen("sample.xml");
|
|
if (root_id)
|
|
{
|
|
void *path_id, *node_id;
|
|
char *s;
|
|
|
|
printf("\nTesting xmlNodeGetString for /*/*/test:\t\t\t\t\t");
|
|
s = xmlNodeGetString(root_id , "/*/*/test");
|
|
if (s)
|
|
{
|
|
printf("failed.\n\t'%s' should be empty\n", s);
|
|
free(s);
|
|
}
|
|
else
|
|
printf("succes.\n");
|
|
|
|
printf("Testing xmlGetString for /Configuration/output/test:\t\t\t");
|
|
path_id = xmlNodeGet(root_id, "/Configuration/output/test");
|
|
if (path_id)
|
|
{
|
|
s = xmlGetString(path_id);
|
|
if (s)
|
|
{
|
|
printf("failed.\n\t'%s' should be empty\n", s);
|
|
free(s);
|
|
}
|
|
else
|
|
printf("succes.\n");
|
|
}
|
|
else
|
|
PRINT_ERROR_AND_EXIT(root_id);
|
|
|
|
path_id = xmlNodeGet(root_id, PATH);
|
|
node_id = xmlNodeGet(root_id, ROOTNODE);
|
|
|
|
if (path_id && node_id)
|
|
{
|
|
char buf[BUFLEN];
|
|
size_t len;
|
|
|
|
xmlCopyString(path_id, buf, BUFLEN);
|
|
printf("Testing xmlNodeCopyString against xmlGetString:\t\t\t\t");
|
|
if ((s = xmlGetString(path_id)) != 0)
|
|
{
|
|
if (strcmp(s, buf)) /* not the same */
|
|
printf("failed.\n\t'%s' differs from '%s'\n", s, buf);
|
|
else
|
|
printf("succes.\n");
|
|
|
|
printf("Testing xmlCopyString against xmlGetString:\t\t\t\t");
|
|
xmlCopyString(path_id, buf, BUFLEN);
|
|
if (strcmp(s, buf)) /* not the same */
|
|
printf("failed.\n\t'%s' differs from\n\t'%s'\n", s, buf);
|
|
else
|
|
printf("succes.\n");
|
|
}
|
|
else
|
|
PRINT_ERROR_AND_EXIT(path_id);
|
|
|
|
printf("Testing xmlCopyString against xmlCompareString:\t\t\t\t");
|
|
if (xmlCompareString(path_id, buf)) /* not the same */
|
|
printf ("failed.\n\t'%s' differs from\n\t'%s'\n", s, buf);
|
|
else
|
|
printf("succes.\n");
|
|
|
|
printf("Testing xmlCopyString against xmlNodeCompareString:\t\t\t");
|
|
if (xmlNodeCompareString(node_id, LEAFNODE, buf)) /* not the same */
|
|
printf("failed.\n\t'%s' differs from\n\t'%s'\n", s, buf);
|
|
else
|
|
printf("succes.\n");
|
|
|
|
if (s) free(s);
|
|
|
|
printf("Testing xmlCopyString against xmlNodeGetString:\t\t\t\t");
|
|
if ((s = xmlNodeGetString(node_id, LEAFNODE)) != 0)
|
|
{
|
|
if (strcmp(s, buf)) /* not the same */
|
|
printf("failed.\n\t'%s' differs from\n\t'%s'\n", s, buf);
|
|
else
|
|
printf("succes.\n");
|
|
free(s);
|
|
}
|
|
else
|
|
PRINT_ERROR_AND_EXIT(node_id);
|
|
|
|
free(path_id);
|
|
path_id = xmlNodeGet(root_id, "/Configuration/backend/name");
|
|
if (path_id)
|
|
{
|
|
printf("Testing xmlAttributeCopyString against xmlAttributeCompareString:\t");
|
|
xmlAttributeCopyString(path_id, "type", buf, BUFLEN);
|
|
if (xmlAttributeCompareString(path_id, "type", buf)) /* no match */
|
|
printf("failed.\n\t'%s' differs\n", buf);
|
|
else
|
|
printf("succes.\n");
|
|
|
|
printf("Testing xmlAttributeCopyString against xmlAttributeGetString:\t\t");
|
|
if ((s = xmlAttributeGetString(path_id, "type")) != 0)
|
|
{
|
|
if (strcmp(s, buf)) /* not the same */
|
|
printf("failed.\n\t'%s' differs from '%s'\n", s, buf);
|
|
else
|
|
printf("succes.\n");
|
|
free(s);
|
|
}
|
|
else
|
|
PRINT_ERROR_AND_EXIT(path_id);
|
|
|
|
}
|
|
else
|
|
PRINT_ERROR_AND_EXIT(root_id);
|
|
|
|
free(node_id);
|
|
free(path_id);
|
|
|
|
path_id = xmlNodeGet(root_id, "Configuration/output/sample/test");
|
|
if (path_id)
|
|
{
|
|
xmlNodeCopyString(root_id ,"Configuration/output/menu/name", buf, BUFLEN);
|
|
printf("Testing xmlCompareString against a fixed string: \t\t\t");
|
|
if (xmlCompareString(path_id, buf)) /* no match */
|
|
printf("failed.\n\t'%s' differs\n", buf);
|
|
else
|
|
printf("succes.\n");
|
|
|
|
s = xmlGetString(path_id);
|
|
if (s)
|
|
{
|
|
printf("Testing xmlGetString against a fixed string: \t\t\t\t");
|
|
if (strcmp(s, buf)) /* mismatch */
|
|
printf("failed.\n\t'%s' differs from\n\t'%s'\n", s, buf);
|
|
else
|
|
printf("succes.\n");
|
|
|
|
printf("Testing xmlCopyString gainst a fixed string: \t\t\t\t");
|
|
xmlCopyString(path_id, buf, BUFLEN);
|
|
if (strcmp(s, buf)) /* mismatch */
|
|
printf("failed.\n\t'%s' differs from\n\t'%s'\n", s, buf);
|
|
else
|
|
printf("succes.\n");
|
|
|
|
free(s);
|
|
}
|
|
else
|
|
PRINT_ERROR_AND_EXIT(path_id);
|
|
|
|
free(path_id);
|
|
}
|
|
}
|
|
|
|
if (xmlErrorGetNo(root_id, 0) != XML_NO_ERROR)
|
|
{
|
|
const char *errstr = xmlErrorGetString(root_id, 0);
|
|
size_t column = xmlErrorGetColumnNo(root_id, 0);
|
|
size_t lineno = xmlErrorGetLineNo(root_id, 1);
|
|
|
|
printf("Error at line %i, column %i: %s\n", lineno, column, errstr);
|
|
}
|
|
|
|
xmlClose(root_id);
|
|
}
|
|
printf("\n");
|
|
|
|
return 0;
|
|
}
|