All pastes #800703 Raw Edit

Someone

public c v1 · immutable
#800703 ·published 2007-11-28 18:01 UTC
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;}