int main(int argc, char** argv) { if((argc < 3) || (argc > 4)) { cerr << "Error: wrong number of arguments." << endl; return(-1); } /* Init libxml */ LIBXML_TEST_VERSION xmlDocPtr doc = getXmlDocFromFile(argv[1]); if (!doc) { cerr <<"main: problem getting xml from " << argv[1] << endl; return(-1); } xmlXPathObjectPtr query_nodes = doXpathQuery(doc, BAD_CAST argv[2]); if (!query_nodes) { cerr << "xpath query :" << argv[1] << " on document " << argv[2] << " returned nothing\n" << endl; return(1); } print_xpath_nodes(query_nodes->nodesetval, stdout); return 0; }
/** * execute_xpath_expression: * @filename:the input XML filename. * @xpathExpr:the xpath expression for evaluation. * @nsList:the optional list of known namespaces in *"<prefix1>=<href1> <prefix2>=href2> ..." format. * * Parses input XML file, evaluates XPath expression and prints results. * * Returns 0 on success and a negative value otherwise. */ int execute_xpath_expression(const char* filename, const xmlChar* xpathExpr, const xmlChar* nsList) { xmlDocPtr doc; xmlXPathContextPtr xpathCtx; xmlXPathObjectPtr xpathObj; assert(filename); assert(xpathExpr); /* Load XML document */ doc = xmlParseFile(filename); if (doc == NULL) { fprintf(stderr, "Error: unable to parse file \"%s\"\n", filename); return(-1); } /* Create xpath evaluation context */ xpathCtx = xmlXPathNewContext(doc); if(xpathCtx == NULL) { fprintf(stderr,"Error: unable to create new XPath context\n"); xmlFreeDoc(doc); return(-1); } /* Register namespaces from list (if any) */ if((nsList != NULL) && (register_namespaces(xpathCtx, nsList) < 0)) { fprintf(stderr,"Error: failed to register namespaces list \"%s\"\n", nsList); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return(-1); } /* Evaluate xpath expression */ xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx); if(xpathObj == NULL) { fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n", xpathExpr); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return(-1); } /* Print results */ print_xpath_nodes(xpathObj->nodesetval, stdout); /* Cleanup */ xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return(0); }
/* * Extract element corresponding to xpath * xml_path The path to the xml file * xpath: The xpath to evaluate. * * Evaluate an xpath expression onto an xml file. * and print the result one by line. * * Returns 0 on success and a negative value otherwise. */ static int extract_xpath(const char *xml_path, const xmlChar *xpath) { xmlDocPtr doc = NULL; xmlXPathContextPtr xpathCtx = NULL; xmlXPathObjectPtr xpathObj = NULL; assert(xml_path); assert(xpath); /* Parse the xml file */ doc = xmlParseFile(xml_path); if (!doc) { fprintf(stderr, "ERR parsing: xml file invalid \"%s\"\n", xml_path); return -1; } /* Initialize a xpath context */ xpathCtx = xmlXPathNewContext(doc); if (!xpathCtx) { fprintf(stderr, "ERR: XPath context invalid\n"); xmlFreeDoc(doc); return -1; } /* Evaluate xpath expression */ xpathObj = xmlXPathEvalExpression(xpath, xpathCtx); if (!xpathObj) { fprintf(stderr, "ERR: invalid xpath expression \"%s\"\n", xpath); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return -1; } /* Print results */ if (print_xpath_nodes(doc, xpathObj->nodesetval, stdout)) { xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return -1; } /* Cleanup */ xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return 0; }
char *execute_xpath_expression (const char* filename, const xmlChar* xpathExpr, const xmlChar* nsList, int size) { xmlDocPtr doc; xmlXPathContextPtr xpathCtx; xmlXPathObjectPtr xpathObj; /* Load XML document */ if(size != 0) { doc = xmlParseMemory(filename, size); } else { doc = xmlParseFile(filename); } if (doc == NULL) { fprintf(stderr, "Error: unable to parse file \"%s\"\n", filename); return; } /* Create xpath evaluation context */ xpathCtx = xmlXPathNewContext(doc); if(xpathCtx == NULL) { fprintf(stderr,"Error: unable to create new XPath context\n"); xmlFreeDoc(doc); return; } /* Evaluate xpath expression */ xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx); if(xpathObj == NULL) { fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n", xpathExpr); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return; } char *content = strdup(print_xpath_nodes(xpathObj->nodesetval)); /* Cleanup */ xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); //g_print("\n%s\n%d", content, strlen(content)); return content; }
/** * execute_xpath_expression: * @filename: the input XML filename. * @xpathExpr: the xpath expression for evaluation. * @nsList: the optional list of known namespaces in * "<prefix1>=<href1> <prefix2>=href2> ..." format. * * Parses input XML file, evaluates XPath expression and prints results. * * Returns 0 on success and a negative value otherwise. */ int execute_xpath_expression(const char* filename, const xmlChar* xpathExpr, char **get, int num) { xmlDocPtr doc; xmlXPathContextPtr xpathCtx; xmlXPathObjectPtr xpathObj; assert(filename); assert(xpathExpr); /* Load XML document */ //doc = xmlParseFile(filename); doc = htmlReadMemory(filename, strlen(filename), NULL, NULL, HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING); //doc = htmlDocPtr(filename, NULL); if (doc == NULL) { fprintf(stderr, "Error: unable to parse this string\n"); return(-1); } /* Create xpath evaluation context */ xpathCtx = xmlXPathNewContext(doc); if(xpathCtx == NULL) { fprintf(stderr,"Error: unable to create new XPath context\n"); xmlFreeDoc(doc); return -1; } /* Evaluate xpath expression */ xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx); if(xpathObj == NULL) { fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n", xpathExpr); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return -1; } /* Print results */ int size = print_xpath_nodes(xpathObj->nodesetval, get, num); /* Cleanup */ xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return size; }