[Soap-Python] Spyne: Dealing with schema reference namespaces OR how to return raw xml to client?
Joni Kivinen
joni.kivinen at simosol.fi
Wed Nov 14 16:04:37 CET 2012
Hey,
I'm trying to get the response from spyne to match up with a set of
fixed schemas, and I'm running to a wall trying to deal with
referenced elements. As an example, using these two schema files:
base.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://xml.test.org/base"
xmlns:a="http://xml.test.org/addon"
xmlns:b="http://xml.test.org/base"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:import namespace="http://xml.test.org/addon"
schemaLocation="addon.xsd"/>
<xs:element name="Test" type="b:TestBase" />
<xs:complexType name="TestBase">
<xs:sequence>
<xs:element name="Value" type="xs:string" />
<xs:element ref="a:Addon" />
</xs:sequence>
</xs:complexType>
</xs:schema>
addon.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://xml.test.org/addon"
xmlns:a="http://xml.test.org/addon"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="Addon" type="a:AddonType" />
<xs:simpleType name="AddonType">
<xs:restriction base="xs:string">
<xs:enumeration value="1" />
<xs:enumeration value="2" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
the result should be something like:
<?xml version="1.0" encoding="UTF-8"?>
<b:Test xmlns:a="http://xml.test.org/addon"
xmlns:b="http://xml.test.org/base"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<b:Value>Value0</b:Value>
<a:Addon>1</a:Addon>
</b:Test>
but whatever I try, I can't figure out how to change the namespace of
immediate children with the spyne classes (while in this case I'm
dealing with enumerations, I can't seem to change it for any other
types either, complex or not).
As a quick example of one way I'm trying to solve this:
addon = Enum('1', '2', type_name='Addon')
addon.__namespace__ = 'http://xml.test.org/addon'
class Test(ComplexModel):
__namespace__ = 'http://xml.test.org/base'
Value = String
Addon = addon
test = Test(Value='1', Addon='2')
print lxml.etree.tostring(get_object_as_xml(test), pretty_print=True)
results in:
<ns0:Test xmlns:ns0="http://xml.test.org/base">
<ns0:Value>1</ns0:Value>
<ns0:Addon>2</ns0:Addon>
</ns0:Test>
That all said, if there is a way to just return raw xml to the client,
that'd work as a workaround for me just fine.
- Joni
More information about the Soap
mailing list