#include #include #include #include #include static xmlXPathObjectPtr matchXPathExpression( char *filename, xmlDocPtr doc, xmlChar *expression ); static xmlXPathObjectPtr matchXPointerExpression( char *filename, xmlDocPtr doc, xmlChar *expression ); static char *commandname = "parse"; int main(int argc, char *argv[]) { xmlDocPtr myTree; char *filename; int xpointer = 0; /* 1 to use xpointer rather than path */ commandname = argv[0]; if (argc == 4) { if (!strcmp(argv[1], "-xpointer")) { xpointer = 1; --argc; ++argv; } } if (argc != 3) { fprintf(stderr, "usage: %s [-xpointer] filename xpath-expr\n", commandname); exit(1); } filename = argv[1]; myTree = xmlParseFile(filename); if (!myTree) { fprintf(stderr, "%s: %s: the parse failed. Alas, I must leave you.\n", commandname, filename ); exit(1); } /* now extract the given xpath expression */ void *result = (xpointer) ? matchXPointerExpression(filename, myTree, (xmlChar *) argv[2]) : matchXPathExpression(filename, myTree, (xmlChar *) argv[2]) ; if (!result) { fprintf(stderr, "%s: %s: no match for %s\n", commandname, filename, argv[2] ); exit(1); } exit(0); } static xmlXPathObjectPtr matchXPathExpression( char *filename, xmlDocPtr doc, xmlChar *expression ) { xmlXPathContextPtr context; xmlXPathObjectPtr result; xmlChar *resultString; xmlXPathInit(); context = xmlXPathNewContext(doc); if (!context) { return NULL; } result = xmlXPathEval(expression, context); if (!result) { return NULL; } /* convert to string for printing */ resultString = xmlXPathCastToString(result); if (resultString) { printf("%s\n", resultString); /* utf8 */ } else { fprintf(stderr, "%s: %s: could not convert result of XPath expression %s to string", commandname, filename, expression); } return result; } static xmlXPathObjectPtr matchXPointerExpression( char *filename, xmlDocPtr doc, xmlChar *expression ) { xmlXPathContextPtr context; xmlXPathObjectPtr result; xmlChar *resultString; context = xmlXPtrNewContext(doc, NULL, NULL /* nodeptr, origin */ ); if (!context) { return NULL; } result = xmlXPtrEval(expression, context); if (!result) { return NULL; } /* convert to string for printing */ resultString = xmlXPathCastToString(result); if (resultString) { printf("%s\n", resultString); /* utf8 */ } else { fprintf(stderr, "%s: %s: could not convert result of XPath expression %s to string", commandname, filename, expression); } return result; }