|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <string.h> |
|
|
#include <stdlib.h> |
|
|
#include <stdio.h> |
|
|
|
|
|
#include "xmlrpc-c/base.h" |
|
|
#include "xmlrpc-c/xmlparser.h" |
|
|
|
|
|
|
|
|
|
|
|
static const char * |
|
|
getStdin(void) { |
|
|
|
|
|
size_t const maxInputSize = 64 * 1024; |
|
|
char * retval; |
|
|
|
|
|
retval = malloc(maxInputSize + 1); |
|
|
|
|
|
if (retval == NULL) { |
|
|
fprintf(stderr, "malloc failed."); |
|
|
exit(100); |
|
|
} else { |
|
|
size_t rc; |
|
|
|
|
|
rc = fread(retval, 1, maxInputSize, stdin); |
|
|
|
|
|
if (rc < 0) |
|
|
fprintf(stderr, "Failed to read Standard Input"); |
|
|
else { |
|
|
size_t const bytesRead = rc; |
|
|
retval[bytesRead] = '\0'; |
|
|
} |
|
|
} |
|
|
return retval; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void |
|
|
describeXmlElement(const xml_element * const elemP, |
|
|
const char * const prefix) { |
|
|
|
|
|
unsigned int i; |
|
|
|
|
|
printf("%sXML element type: '%s'\n", |
|
|
prefix, xml_element_name(elemP)); |
|
|
|
|
|
printf("%sCdata: '%s'\n", |
|
|
prefix, xml_element_cdata(elemP)); |
|
|
|
|
|
printf("%sNumber of child elements: %u\n", |
|
|
prefix, xml_element_children_size(elemP)); |
|
|
|
|
|
if (xml_element_children_size(elemP) == 0) |
|
|
printf("\n"); |
|
|
|
|
|
for (i = 0; i < xml_element_children_size(elemP); ++i) { |
|
|
char * const newPrefix = malloc(strlen(prefix) + 2); |
|
|
sprintf(newPrefix, "%s ", prefix); |
|
|
describeXmlElement(xml_element_children(elemP)[i], newPrefix); |
|
|
free(newPrefix); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
main(int argc, const char ** argv) { |
|
|
|
|
|
const char * xml; |
|
|
xmlrpc_env env; |
|
|
xml_element * elemP; |
|
|
|
|
|
xmlrpc_env_init(&env); |
|
|
|
|
|
xml = getStdin(); |
|
|
|
|
|
xml_parse(&env, xml, strlen(xml), &elemP); |
|
|
|
|
|
if (env.fault_occurred) |
|
|
printf("xml_parse failed. %s\n", env.fault_string); |
|
|
else { |
|
|
printf("Parsed successfully.\n"); |
|
|
|
|
|
describeXmlElement(elemP, ""); |
|
|
} |
|
|
xmlrpc_env_clean(&env); |
|
|
|
|
|
return 0; |
|
|
} |
|
|
|