1.1 --- a/libxml2dom/soap.py Sun Sep 30 23:23:48 2007 +0000
1.2 +++ b/libxml2dom/soap.py Mon Oct 01 23:26:37 2007 +0000
1.3 @@ -91,6 +91,13 @@
1.4 elif Node_localName(_node) == "Text":
1.5 return SOAPTextElement(_node, self, context_node.ownerDocument)
1.6
1.7 + # Detect the method element.
1.8 +
1.9 + if Node_parentNode(_node) and Node_localName(Node_parentNode(_node)) == "Body" and \
1.10 + Node_namespaceURI(Node_parentNode(_node)) == SOAP_ENVELOPE_NAMESPACE:
1.11 +
1.12 + return SOAPMethodElement(_node, self, context_node.ownerDocument)
1.13 +
1.14 # Otherwise, make generic SOAP elements.
1.15
1.16 return SOAPElement(_node, self, context_node.ownerDocument)
1.17 @@ -136,26 +143,14 @@
1.18
1.19 # Convenience methods and properties.
1.20
1.21 - def _methodName(self):
1.22 - return self.envelope.body.methodName
1.23 -
1.24 - def _parameterItems(self):
1.25 - return self.envelope.body.parameterItems
1.26 -
1.27 - def _parameterValues(self):
1.28 - return self.envelope.body.parameterValues
1.29 -
1.30 - def _parameterMap(self):
1.31 - return self.envelope.body.parameterMap
1.32 -
1.33 def _fault(self):
1.34 return self.envelope.body.fault
1.35
1.36 - methodName = property(_methodName)
1.37 - parameterItems = property(_parameterItems)
1.38 - parameterValues = property(_parameterValues)
1.39 - parameterMap = property(_parameterMap)
1.40 + def _method(self):
1.41 + return self.envelope.body.method
1.42 +
1.43 fault = property(_fault)
1.44 + method = property(_method)
1.45
1.46 class SOAPElement(SOAPNode):
1.47
1.48 @@ -197,19 +192,28 @@
1.49 def _method(self):
1.50 return (self.xpath("./*[@env:encodingStyle = '%s']" % SOAP_ENCODING_NAMESPACE) or [None])[0]
1.51
1.52 + # Node construction methods.
1.53 +
1.54 + def createFault(self):
1.55 + return self.ownerDocument.createElementNS(SOAP_ENVELOPE_NAMESPACE, "env:Fault")
1.56 +
1.57 + fault = property(_fault)
1.58 + method = property(_method)
1.59 +
1.60 +class SOAPMethodElement(SOAPNode):
1.61 +
1.62 + "A SOAP method element."
1.63 +
1.64 def _methodName(self):
1.65 - if self.method is not None:
1.66 - return self.method.localName
1.67 - else:
1.68 - return None
1.69 + return self.localName
1.70
1.71 def _resultParameter(self):
1.72 - return (self.method.xpath(".//rpc:result") or [None])[0]
1.73 + return (self.xpath(".//rpc:result") or [None])[0]
1.74
1.75 def _resultParameterValue(self):
1.76 if self.resultParameter:
1.77 name = self.resultParameter.textContent.strip()
1.78 - result = self.method.xpath(".//%s" % name, namespaces={self.method.prefix : self.method.namespaceURI})
1.79 + result = self.xpath(".//%s" % name, namespaces={self.prefix : self.namespaceURI})
1.80 if result:
1.81 return result[0].textContent.strip()
1.82 else:
1.83 @@ -218,70 +222,55 @@
1.84 return None
1.85
1.86 def _parameters(self):
1.87 - if self.method is not None:
1.88 - return self.method.xpath("*")
1.89 - else:
1.90 - return []
1.91 + return self.xpath("*")
1.92
1.93 - def _parameterItems(self):
1.94 + def _parameterValues(self):
1.95 values = []
1.96 for parameter in self.parameters:
1.97 - values.append(self._item_contents(parameter))
1.98 + values.append(self._get_value(parameter))
1.99 return values
1.100
1.101 - def _parameterValues(self):
1.102 - return self._value_contents(self.parameterItems)
1.103 + def _setParameterValues(self, parameters):
1.104 + for node in self.parameters:
1.105 + self.removeChild(node)
1.106
1.107 - def _parameterMap(self):
1.108 - return self._map_contents(self.parameterItems)
1.109 + # Add the parameter values.
1.110 +
1.111 + for parameter in parameters:
1.112 + self._add_value(self, parameter)
1.113
1.114 # Internal methods.
1.115
1.116 - def _item_contents(self, parameter):
1.117 + def _add_value(self, value, parameter):
1.118 + (ns, name), parameter = parameter
1.119 + container = self.ownerDocument.createElementNS(ns, name)
1.120 + value.appendChild(container)
1.121 + if isinstance(parameter, (list, dict)):
1.122 + if isinstance(parameter, dict):
1.123 + items = parameter.items()
1.124 + else:
1.125 + items = parameter
1.126 + for item in items:
1.127 + self._add_value(container, item)
1.128 + else:
1.129 + text = self.ownerDocument.createTextNode(unicode(parameter))
1.130 + container.appendChild(text)
1.131 +
1.132 + def _get_value(self, parameter):
1.133 elements = parameter.xpath("*")
1.134 if elements:
1.135 items = []
1.136 for element in elements:
1.137 - items.append(self._item_contents(element))
1.138 - return (parameter.namespaceURI, parameter.localName), items
1.139 + items.append(self._get_value(element))
1.140 + return (parameter.namespaceURI, parameter.name), items
1.141 else:
1.142 - return (parameter.namespaceURI, parameter.localName), parameter.textContent.strip()
1.143 -
1.144 - def _value_contents(self, items):
1.145 - values = []
1.146 - for (typename, name), value in items:
1.147 - if isinstance(value, list):
1.148 - values.append(self._value_contents(value))
1.149 - elif name is None:
1.150 - values.append(value)
1.151 - else:
1.152 - values.append((name, value))
1.153 - return values
1.154 + return (parameter.namespaceURI, parameter.name), parameter.textContent.strip()
1.155
1.156 - def _map_contents(self, items):
1.157 - d = {}
1.158 - for n, ((typename, name), value) in enumerate(items):
1.159 - key_name = name or str(n)
1.160 - if isinstance(value, list):
1.161 - d[(typename, key_name)] = self._map_contents(value)
1.162 - else:
1.163 - d[(typename, key_name)] = value
1.164 - return d
1.165 -
1.166 - # Node construction methods.
1.167 -
1.168 - def createFault(self):
1.169 - return self.ownerDocument.createElementNS(SOAP_ENVELOPE_NAMESPACE, "env:Fault")
1.170 -
1.171 - fault = property(_fault)
1.172 - method = property(_method)
1.173 methodName = property(_methodName)
1.174 resultParameter = property(_resultParameter)
1.175 resultParameterValue = property(_resultParameterValue)
1.176 parameters = property(_parameters)
1.177 - parameterItems = property(_parameterItems)
1.178 - parameterValues = property(_parameterValues)
1.179 - parameterMap = property(_parameterMap)
1.180 + parameterValues = property(_parameterValues, _setParameterValues)
1.181
1.182 class SOAPFaultElement(SOAPNode):
1.183