summaryrefslogtreecommitdiff
path: root/ext/soap/php_xml.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2004-02-05 09:28:09 +0000
committerDmitry Stogov <dmitry@php.net>2004-02-05 09:28:09 +0000
commit2c1dcf32a04482613229b5d31b736b789a1dbc9b (patch)
tree3c6e4a2890e44b514494f79e80f11dc4c00b3fd8 /ext/soap/php_xml.c
parent1c433049ca51f61687ff97d9ddd0ade03d2da5c3 (diff)
downloadphp-git-2c1dcf32a04482613229b5d31b736b789a1dbc9b.tar.gz
WSDL parsing speedup. Source cleanup.
Diffstat (limited to 'ext/soap/php_xml.c')
-rw-r--r--ext/soap/php_xml.c185
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);
-}