rendered paste body#include <libxml/parser.h>#include <libxml/xpath.h>xmlXPathObjectPtr _getXPathName(xmlDocPtr doc, xmlXPathContextPtr context, xmlChar *xpath);xmlXPathObjectPtr _getXPathValue(xmlDocPtr doc, xmlXPathContextPtr context, xmlChar *xpath);int main(int argc, char **argv) { char *docname; xmlDocPtr doc; xmlXPathContextPtr context; xmlNodeSetPtr nodeset; xmlXPathObjectPtr psXPathTmp; char *pszRequest; xmlChar *pszUpdateSequence; xmlChar *pszService; xmlChar *pszVersion; int i; xmlChar *pszTmp; if (argc <= 1) { printf("Usage: %s <file>\n", argv[0]); return(0); } /* load document */ docname = argv[1]; doc = xmlParseFile(docname); if (doc == NULL ) { fprintf(stderr,"Document not parsed successfully. \n"); return 1; } /* load context */ context = xmlXPathNewContext(doc); if (context == NULL) { printf("Error in xmlXPathNewContext\n"); return 1; } /* register namespaces */ if(xmlXPathRegisterNs(context, "sos", "http://www.opengis.net/sos/1.0") != 0 || xmlXPathRegisterNs(context, "ows", "http://www.opengis.net/ows") != 0) { printf("Couldn't register namespaces\n"); return; } /* check for service */ psXPathTmp = _getXPathValue(doc, context, (xmlChar *)"/*/@service"); if (psXPathTmp) { nodeset = psXPathTmp->nodesetval; pszService = xmlNodeListGetString(doc, nodeset->nodeTab[0]->xmlChildrenNode, 1); printf("service = %s\n", pszService); xmlFree(pszService); } xmlXPathFreeObject(psXPathTmp); /* check for updateSequence*/ psXPathTmp = _getXPathValue(doc, context, (xmlChar *)"/*/@updateSequence"); if (psXPathTmp) { nodeset = psXPathTmp->nodesetval; pszUpdateSequence = xmlNodeListGetString(doc, nodeset->nodeTab[0]->xmlChildrenNode, 1); printf("updateSequence = %s\n", pszUpdateSequence); xmlFree(pszUpdateSequence); } xmlXPathFreeObject(psXPathTmp); /* check for version */ psXPathTmp = _getXPathValue(doc, context, (xmlChar *)"/*/ows:AcceptVersions/ows:Version"); if (psXPathTmp) { nodeset = psXPathTmp->nodesetval; pszVersion = xmlNodeListGetString(doc, nodeset->nodeTab[0]->xmlChildrenNode, 1); printf("version = %s\n", pszVersion); xmlFree(pszVersion); } xmlXPathFreeObject(psXPathTmp); /* check for request */ psXPathTmp = _getXPathName(doc, context, (xmlChar *)"/*"); if (psXPathTmp) { printf("foo\n"); nodeset = psXPathTmp->nodesetval; pszVersion = xmlNodeListGetString(doc, nodeset->nodeTab[0]->xmlChildrenNode, 1); printf("version = %s\n", pszVersion); xmlFree(pszVersion); } xmlXPathFreeObject(psXPathTmp); xmlXPathFreeContext(context); xmlFreeDoc(doc); xmlCleanupParser(); return;}xmlXPathObjectPtr _getXPathName(xmlDocPtr doc, xmlXPathContextPtr context, xmlChar *xpath){ xmlXPathObjectPtr result; result = xmlXPathEval(xpath, context); if (result == NULL) { printf("Error in xmlXPathEvalExpression\n"); return NULL; } if(xmlXPathNodeSetIsEmpty(result->nodesetval)){ xmlXPathFreeObject(result); return NULL; } return result;}xmlXPathObjectPtr _getXPathValue(xmlDocPtr doc, xmlXPathContextPtr context, xmlChar *xpath){ xmlXPathObjectPtr result; result = xmlXPathEvalExpression(xpath, context); if (result == NULL) { printf("Error in xmlXPathEvalExpression\n"); return NULL; } if(xmlXPathNodeSetIsEmpty(result->nodesetval)){ xmlXPathFreeObject(result); return NULL; } return result;}