rendered paste body#include <string.h>#include <libxml/parser.h>#include <libxml/xpath.h>#include <libxml/xpathInternals.h>typedef struct { char *pszVersion; char *pszUpdateSequence; char *pszRequest; char *pszService; char *pszOutputFormat; char *pszSensorId; char *pszOffering; char *pszObservedProperty; char *pszResult; char *pszResultFormat; char *pszResultModel;} sosParamsObj;void msOWSCommonParseRequest(char *xml, sosParamsObj *spo);static xmlXPathObjectPtr _getXPath(xmlDocPtr doc, xmlXPathContextPtr context, xmlChar *xpath);int main(int argc, char **argv) { sosParamsObj *spo; spo = (sosParamsObj *)calloc(1, sizeof(sosParamsObj)); spo->pszRequest = NULL; spo->pszVersion = NULL; spo->pszService = NULL; spo->pszUpdateSequence = NULL; if (argc <= 1) { printf("Usage: %s <xml>\n", argv[0]); return 1; } msOWSCommonParseRequest(argv[1], spo); printf("service = %s\n", spo->pszService); printf("version = %s\n", spo->pszVersion); printf("updateSequence = %s\n", spo->pszUpdateSequence); printf("request = %s\n", spo->pszRequest); free(spo->pszService); free(spo->pszVersion); free(spo->pszUpdateSequence); free(spo->pszRequest); return 0;}void msOWSCommonParseRequest(char *xml, sosParamsObj *spo) { xmlDocPtr doc; xmlXPathContextPtr context; xmlNodeSetPtr nodeset; xmlXPathObjectPtr psXPathTmp; /* load document */ doc = xmlParseFile(xml); if (doc == NULL ) { doc = xmlParseDoc((xmlChar *)xml); if (doc == NULL ) { fprintf(stderr,"Document not parsed successfully. \n"); return; } } /* load context */ context = xmlXPathNewContext(doc); if (context == NULL) { printf("Error in xmlXPathNewContext\n"); return; } /* register namespaces */ if(xmlXPathRegisterNs(context, (xmlChar *)"sos", (xmlChar *)"http://www.opengis.net/sos/1.0") != 0 || xmlXPathRegisterNs(context, (xmlChar *)"ows", (xmlChar *)"http://www.opengis.net/ows") != 0) { printf("Couldn't register namespaces\n"); return; } /* check for service */ psXPathTmp = _getXPath(doc, context, (xmlChar *)"/*/@service"); if (psXPathTmp) { nodeset = psXPathTmp->nodesetval; spo->pszService = (char *)xmlNodeListGetString(doc, nodeset->nodeTab[0]->xmlChildrenNode, 1); } xmlXPathFreeObject(psXPathTmp); /* check for updateSequence*/ psXPathTmp = _getXPath(doc, context, (xmlChar *)"/*/@updateSequence"); if (psXPathTmp) { nodeset = psXPathTmp->nodesetval; spo->pszUpdateSequence = (char *)xmlNodeListGetString(doc, nodeset->nodeTab[0]->xmlChildrenNode, 1); } xmlXPathFreeObject(psXPathTmp); /* check for version */ psXPathTmp = _getXPath(doc, context, (xmlChar *)"/*/ows:AcceptVersions/ows:Version"); if (psXPathTmp) { nodeset = psXPathTmp->nodesetval; spo->pszVersion = (char *)xmlNodeListGetString(doc, nodeset->nodeTab[0]->xmlChildrenNode, 1); } xmlXPathFreeObject(psXPathTmp); /* check for request */ psXPathTmp = _getXPath(doc, context, (xmlChar *)"local-name(/*)"); if (psXPathTmp) { nodeset = psXPathTmp->nodesetval; spo->pszRequest = (char *)xmlNodeListGetString(doc, nodeset->nodeTab[0]->xmlChildrenNode, 1); } xmlXPathFreeObject(psXPathTmp); xmlXPathFreeContext(context); xmlFreeDoc(doc); xmlCleanupParser(); return;}static xmlXPathObjectPtr _getXPath(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;}