diff options
| author | Shane Caraveo <shane@php.net> | 2002-07-07 23:03:43 +0000 | 
|---|---|---|
| committer | Shane Caraveo <shane@php.net> | 2002-07-07 23:03:43 +0000 | 
| commit | f8875adaab9fe973ab798ead093e21972ed43a13 (patch) | |
| tree | d5495bb982d966a5bb42afb20fb80338cccce1f4 /ext/soap/php_xml.c | |
| parent | a6d815fb7c98c32a4180e30dfaca316cbeae8912 (diff) | |
| download | php-git-f8875adaab9fe973ab798ead093e21972ed43a13.tar.gz | |
import php-soap library from sourceforge
Diffstat (limited to 'ext/soap/php_xml.c')
| -rw-r--r-- | ext/soap/php_xml.c | 214 | 
1 files changed, 214 insertions, 0 deletions
| diff --git a/ext/soap/php_xml.c b/ext/soap/php_xml.c new file mode 100644 index 0000000000..707d073984 --- /dev/null +++ b/ext/soap/php_xml.c @@ -0,0 +1,214 @@ +#include "php_soap.h" + +xmlNsPtr attr_find_ns(xmlAttrPtr node) +{ +	if(node->ns) +		return node->ns; +	else if(node->parent->ns) +		return node->parent->ns; +	else +		return xmlSearchNs(node->doc, node->parent, NULL); +} + +xmlNsPtr node_find_ns(xmlNodePtr node) +{ +	if(node->ns) +		return node->ns; +	else +		return xmlSearchNs(node->doc, node, NULL); +} + +int attr_is_equal_ex(xmlAttrPtr node, char *name, char *ns) +{ +	if(!strcmp(node->name, name)) +	{ +		if(ns) +		{ +			xmlNsPtr nsPtr; +			if(node->ns) +				nsPtr = node->ns; +			else if(node->parent->ns) +				nsPtr = node->parent->ns; +			else +				nsPtr = xmlSearchNs(node->doc, node->parent, NULL); +			if(!strcmp(nsPtr->href, ns)) +				return TRUE; +			return FALSE; +		} +		return TRUE; +	} +	return FALSE; +} + +int node_is_equal_ex(xmlNodePtr node, char *name, char *ns) +{ +	if(!strcmp(node->name, name)) +	{ +		if(ns) +		{ +			xmlNsPtr nsPtr; +			if(node->ns) +				nsPtr = node->ns; +			else +				nsPtr = xmlSearchNs(node->doc, node, NULL); +			if(!strcmp(nsPtr->href, ns)) +				return TRUE; +			return FALSE; +		} +		return TRUE; +	} +	return FALSE; +} + +xmlAttrPtr get_attribute_ex(xmlAttrPtr node, char *name, char *ns) +{ +	xmlAttrPtr trav = node; +	if(node == NULL) return NULL; +	do { +		if(attr_is_equal_ex(trav, name, ns)) +			return trav; +	} while(trav = trav->next); +	return NULL; +} + +xmlNodePtr get_node_ex(xmlNodePtr node, char *name, char *ns) +{ +	xmlNodePtr trav = node; +	if(node == NULL) return NULL; +	do { +		if(node_is_equal_ex(trav, name, ns)) +			return trav; +	} while(trav = trav->next); +	return NULL; +} + +xmlNodePtr get_node_recurisve_ex(xmlNodePtr node, char *name, char *ns) +{ +	xmlNodePtr trav = node; +	if(node == NULL) return NULL; +	do +	{ +		if(node_is_equal_ex(trav, name, ns)) +			return trav; +		else +		{ +			if(node->children != NULL) +			{ +				xmlNodePtr tmp; +				tmp = get_node_recurisve_ex(node->children, name, ns); +				if(tmp) +					return tmp; +			} +		} +	} while(trav = trav->next); +	return NULL; +} + +xmlNodePtr get_node_with_attribute_ex(xmlNodePtr node, char *name, char *name_ns, char *attribute, char *value, char *attr_ns) +{ +	xmlNodePtr trav = node, cur; +	xmlAttrPtr attr; + +	if(node == NULL) return NULL; +	do +	{ +		if(name != NULL) +		{ +			cur = get_node_ex(trav, name, name_ns); +			if(!cur) +				return cur; +		} +		else +			cur = trav; + +		attr = get_attribute_ex(cur->properties, attribute, attr_ns); +		if(attr != NULL && strcmp(attr->children->content, value) == 0) +			return cur; +		else +		{ +			if(cur->children != NULL) +			{ +				xmlNodePtr tmp; +				tmp = get_node_with_attribute_ex(cur->children, name, name_ns, attribute, value, attr_ns); +				if(tmp) +					return tmp; +			} +		} +	}while(trav = trav->next); +	return NULL; +} + +xmlNodePtr get_node_with_attribute_recursive_ex(xmlNodePtr node, char *name, char *name_ns, char *attribute, char *value, char *attr_ns) +{ +	xmlNodePtr trav = node, cur; +	xmlAttrPtr attr; + +	if(node == NULL) return NULL; +	do +	{ +		if(name != NULL) +		{ +			cur = get_node_recurisve_ex(trav, name, name_ns); +			if(!cur) +				return cur; +		} +		else +			cur = trav; + +		attr = get_attribute_ex(cur->properties, attribute, attr_ns); +		if(attr != NULL && strcmp(attr->children->content, value) == 0) +			return cur; +		else +		{ +			if(cur->children != NULL) +			{ +				xmlNodePtr tmp; +				tmp = get_node_with_attribute_recursive_ex(cur->children, name, name_ns, attribute, value, attr_ns); +				if(tmp) +					return tmp; +			} +		} +	}while(trav = trav->next); +	return NULL; +} + +xmlNodePtr check_and_resolve_href(xmlNodePtr data) +{ +	xmlAttrPtr href; +	xmlNodePtr ret = data; + +	if(!data || !data->properties) +		return ret; + +	href = get_attribute(data->properties, "href"); +	if(href) +	{ +		// Internal href try and find node +		if(href->children->content[0] == '#') +		{ +			ret = get_node_with_attribute_recursive(data->doc->children, NULL, "id", &href->children->content[1]); +		} +		// External href....? +	} + +	return ret; +} + +int parse_namespace(char *inval, char **value, char **namespace) +{ +	char *found = strchr(inval, ':'); + +	if(found != NULL) +	{ +		(*namespace) = estrndup(inval, found - inval); +		(*value) = estrdup(++found); +	} +	else +	{ +		(*value) = estrdup(inval); +		(*namespace) = NULL; +	} + +	return FALSE; +} + | 
