summaryrefslogtreecommitdiff
path: root/ext/soap/php_xml.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2004-01-30 15:07:19 +0000
committerDmitry Stogov <dmitry@php.net>2004-01-30 15:07:19 +0000
commitb81645edd3912d6dca99d56649736a0b23056964 (patch)
tree3db256bb236511558a7a5e2b01d804bac1cf8c9f /ext/soap/php_xml.c
parent356e8f9b7d9495874244143e0ec490b519c1c3cf (diff)
downloadphp-git-b81645edd3912d6dca99d56649736a0b23056964.tar.gz
SOAP 1.2 specification conformity was improved
Diffstat (limited to 'ext/soap/php_xml.c')
-rw-r--r--ext/soap/php_xml.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/ext/soap/php_xml.c b/ext/soap/php_xml.c
index f2a50b50f9..65e058c2bf 100644
--- a/ext/soap/php_xml.c
+++ b/ext/soap/php_xml.c
@@ -194,3 +194,50 @@ 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);
+}