[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