diff options
author | Dmitry Stogov <dmitry@php.net> | 2004-02-05 09:28:09 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2004-02-05 09:28:09 +0000 |
commit | 2c1dcf32a04482613229b5d31b736b789a1dbc9b (patch) | |
tree | 3c6e4a2890e44b514494f79e80f11dc4c00b3fd8 /ext/soap/php_xml.c | |
parent | 1c433049ca51f61687ff97d9ddd0ade03d2da5c3 (diff) | |
download | php-git-2c1dcf32a04482613229b5d31b736b789a1dbc9b.tar.gz |
WSDL parsing speedup. Source cleanup.
Diffstat (limited to 'ext/soap/php_xml.c')
-rw-r--r-- | ext/soap/php_xml.c | 185 |
1 files changed, 138 insertions, 47 deletions
diff --git a/ext/soap/php_xml.c b/ext/soap/php_xml.c index 0f03d19fa7..6912be670c 100644 --- a/ext/soap/php_xml.c +++ b/ext/soap/php_xml.c @@ -20,10 +20,148 @@ /* $Id$ */ #include "php_soap.h" +#include "libxml/parser.h" +#include "libxml/parserInternals.h" /* Channel libxml file io layer through the PHP streams subsystem. * This allows use of ftps:// and https:// urls */ +static int is_blank(const char* str) +{ + while (*str != '\0') { + if (*str != ' ' && *str != 0x9 && *str != 0xa && *str != 0xd) { + return 0; + } + str++; + } + return 1; +} + +/* removes all empty text, comments and other insignoficant nodes */ +static void cleanup_xml_node(xmlNodePtr node) +{ + xmlNodePtr trav; + xmlNodePtr del = NULL; + + trav = node->children; + while (trav != NULL) { + if (del != NULL) { +fprintf(stderr,"***garbage\n"); + xmlUnlinkNode(del); + xmlFreeNode(del); + del = NULL; + } + if (trav->type == XML_TEXT_NODE) { + if (is_blank(trav->content)) { + del = trav; + } + } else if ((trav->type != XML_ELEMENT_NODE) && + (trav->type != XML_CDATA_SECTION_NODE)) { + del = trav; + } else if (trav->children != NULL) { + cleanup_xml_node(trav); + } + trav = trav->next; + } + if (del != NULL) { + xmlUnlinkNode(del); + xmlFreeNode(del); + } +} + +static void soap_ignorableWhitespace(void *ctx, const xmlChar *ch, int len) +{ +} + +static void soap_Comment(void *ctx, const xmlChar *value) +{ +} + +xmlDocPtr soap_xmlParseFile(const char *filename) +{ + xmlParserCtxtPtr ctxt = NULL; + xmlDocPtr ret; + +/* + xmlInitParser(); +*/ + ctxt = xmlCreateFileParserCtxt(filename); + if (ctxt) { + ctxt->keepBlanks = 0; + ctxt->sax->ignorableWhitespace = soap_ignorableWhitespace; + ctxt->sax->comment = soap_Comment; + ctxt->sax->warning = NULL; + ctxt->sax->error = NULL; + /*ctxt->sax->fatalError = NULL;*/ + xmlParseDocument(ctxt); + if (ctxt->wellFormed) { + ret = ctxt->myDoc; + if (ret->URL == NULL && ctxt->directory != NULL) { + ret->URL = xmlStrdup(ctxt->directory); + } + } else { + ret = NULL; + xmlFreeDoc(ctxt->myDoc); + ctxt->myDoc = NULL; + } + xmlFreeParserCtxt(ctxt); + } else { + ret = NULL; + } + +/* + xmlCleanupParser(); +*/ + + if (ret) { + cleanup_xml_node((xmlNodePtr)ret); + } + return ret; +} + +xmlDocPtr soap_xmlParseMemory(const void *buf, size_t buf_size) +{ + xmlParserCtxtPtr ctxt = NULL; + xmlDocPtr ret; + +/* + xmlInitParser(); +*/ + ctxt = xmlCreateMemoryParserCtxt(buf, buf_size); + if (ctxt) { + ctxt->sax->ignorableWhitespace = soap_ignorableWhitespace; + ctxt->sax->comment = soap_Comment; + ctxt->sax->warning = NULL; + ctxt->sax->error = NULL; + /*ctxt->sax->fatalError = NULL;*/ + xmlParseDocument(ctxt); + if (ctxt->wellFormed) { + ret = ctxt->myDoc; + if (ret->URL == NULL && ctxt->directory != NULL) { + ret->URL = xmlStrdup(ctxt->directory); + } + } else { + ret = NULL; + xmlFreeDoc(ctxt->myDoc); + ctxt->myDoc = NULL; + } + xmlFreeParserCtxt(ctxt); + } else { + ret = NULL; + } + +/* + xmlCleanupParser(); +*/ + +/* + if (ret) { + cleanup_xml_node((xmlNodePtr)ret); + } +*/ + return ret; +} + int php_stream_xmlIO_match_wrapper(const char *filename) { TSRMLS_FETCH(); @@ -194,50 +332,3 @@ int parse_namespace(const char *inval, char **value, char **namespace) return FALSE; } - -static int is_blank(const char* str) -{ - while (*str != '\0') { - if (*str != ' ' && *str != 0x9 && *str != 0xa && *str != 0xd) { - return 0; - } - str++; - } - return 1; -} - -/* removes all empty text, comments and other insignoficant nodes */ -static void cleanup_xml_node(xmlNodePtr node) -{ - xmlNodePtr trav; - xmlNodePtr del = NULL; - - trav = node->children; - while (trav != NULL) { - if (del != NULL) { - xmlUnlinkNode(del); - xmlFreeNode(del); - del = NULL; - } - if (trav->type == XML_TEXT_NODE) { - if (is_blank(trav->content)) { - del = trav; - } - } else if ((trav->type != XML_ELEMENT_NODE) && - (trav->type != XML_CDATA_SECTION_NODE)) { - del = trav; - } else if (trav->children != NULL) { - cleanup_xml_node(trav); - } - trav = trav->next; - } - if (del != NULL) { - xmlUnlinkNode(del); - xmlFreeNode(del); - } -} - -void cleanup_xml(xmlDocPtr doc) -{ - cleanup_xml_node((xmlNodePtr)doc); -} |