def create_xml_soap_map(values): """Create an http://xml.apache.org/xml-soap#Map value.""" Map = xsd.ComplexType( xsd.Sequence([ xsd.Element( 'item', xsd.AnyType(), min_occurs=1, max_occurs="unbounded"), ]), qname=etree.QName('{http://xml.apache.org/xml-soap}Map')) KeyValueData = xsd.Element( '{http://xml.apache.org/xml-soap}KeyValueData', xsd.ComplexType( xsd.Sequence([ xsd.Element( 'key', xsd.AnyType(), ), xsd.Element( 'value', xsd.AnyType(), ), ]), ), ) return Map(item=[ KeyValueData( xsd.AnyObject(xsd.String(), key), xsd.AnyObject(guess_xsd_type(value), value) ) for key, value in values.items() ])
def test_sequence_parse_anytype_obj(): value_type = xsd.ComplexType( xsd.Sequence([ xsd.Element('{http://tests.python-zeep.org/}value', xsd.Integer()), ])) schema = Schema( etree.Element('{http://www.w3.org/2001/XMLSchema}Schema', targetNamespace='http://tests.python-zeep.org/')) root = list(schema._schemas.values())[0] root.register_type('{http://tests.python-zeep.org/}something', value_type) custom_type = xsd.Element( etree.QName('http://tests.python-zeep.org/', 'container'), xsd.ComplexType( xsd.Sequence([ xsd.Element( etree.QName('http://tests.python-zeep.org/', 'item_1'), xsd.AnyType()), ]))) expected = etree.fromstring(""" <ns0:container xmlns:ns0="http://tests.python-zeep.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ns0:item_1 xsi:type="ns0:something"> <ns0:value>100</ns0:value> </ns0:item_1> </ns0:container> """) obj = custom_type.parse(expected, schema) assert obj.item_1.value == 100
def test_parse_anytype_obj(): value_type = xsd.ComplexType(children=[ xsd.Element('{http://tests.python-zeep.org/}value', xsd.Integer()), ]) schema = xsd.Schema() schema.register_type('{http://tests.python-zeep.org/}something', value_type) custom_type = xsd.Element( etree.QName('http://tests.python-zeep.org/', 'container'), xsd.ComplexType(children=[ xsd.Element(etree.QName('http://tests.python-zeep.org/', 'item_1'), xsd.AnyType()), ])) expected = etree.fromstring(""" <ns0:container xmlns:ns0="http://tests.python-zeep.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ns0:item_1 xsi:type="ns0:something"> <ns0:value>100</ns0:value> </ns0:item_1> </ns0:container> """) obj = custom_type.parse(expected, schema) assert obj.item_1.value == 100
def test_parse_anytype(): custom_type = xsd.Element( etree.QName('http://tests.python-zeep.org/', 'container'), xsd.ComplexType(children=[ xsd.Element(etree.QName('http://tests.python-zeep.org/', 'item_1'), xsd.AnyType()), ])) expected = etree.fromstring(""" <ns0:container xmlns:ns0="http://tests.python-zeep.org/"> <ns0:item_1>foo</ns0:item_1> </ns0:container> """) obj = custom_type.parse(expected, None) assert obj.item_1 == 'foo'
def test_sequence_parse_anytype(): custom_type = xsd.Element( etree.QName("http://tests.python-zeep.org/", "container"), xsd.ComplexType( xsd.Sequence([ xsd.Element( etree.QName("http://tests.python-zeep.org/", "item_1"), xsd.AnyType(), ) ])), ) expected = etree.fromstring(""" <ns0:container xmlns:ns0="http://tests.python-zeep.org/"> <ns0:item_1>foo</ns0:item_1> </ns0:container> """) obj = custom_type.parse(expected, None) assert obj.item_1 == "foo"
def test_sequence_parse_anytype_obj(): value_type = xsd.ComplexType( xsd.Sequence( [xsd.Element("{http://tests.python-zeep.org/}value", xsd.Integer())] ) ) schema = Schema( etree.Element( "{http://www.w3.org/2001/XMLSchema}Schema", targetNamespace="http://tests.python-zeep.org/", ) ) root = schema.root_document root.register_type("{http://tests.python-zeep.org/}something", value_type) custom_type = xsd.Element( etree.QName("http://tests.python-zeep.org/", "container"), xsd.ComplexType( xsd.Sequence( [ xsd.Element( etree.QName("http://tests.python-zeep.org/", "item_1"), xsd.AnyType(), ) ] ) ), ) expected = etree.fromstring( """ <ns0:container xmlns:ns0="http://tests.python-zeep.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ns0:item_1 xsi:type="ns0:something"> <ns0:value>100</ns0:value> </ns0:item_1> </ns0:container> """ ) obj = custom_type.parse(expected, schema) assert obj.item_1.value == 100
def test_sequence_parse_anytype_obj(): value_type = xsd.ComplexType( xsd.Sequence([ xsd.Element( '{http://tests.python-zeep.org/}value', xsd.Integer()), ]) ) parser_context = ParserContext() schema = SchemaDocument( etree.Element('{http://www.w3.org/2001/XMLSchema}Schema'), transport=None, location=None, parser_context=parser_context, base_url=None) schema._target_namespace = 'http://tests.python-zeep.org/' schema.register_type('{http://tests.python-zeep.org/}something', value_type) custom_type = xsd.Element( etree.QName('http://tests.python-zeep.org/', 'container'), xsd.ComplexType( xsd.Sequence([ xsd.Element( etree.QName('http://tests.python-zeep.org/', 'item_1'), xsd.AnyType()), ]) )) expected = etree.fromstring(""" <ns0:container xmlns:ns0="http://tests.python-zeep.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ns0:item_1 xsi:type="ns0:something"> <ns0:value>100</ns0:value> </ns0:item_1> </ns0:container> """) obj = custom_type.parse(expected, schema) assert obj.item_1.value == 100
def test_xml_complex_any_types(): # see https://github.com/mvantellingen/python-zeep/issues/252 schema = xsd.Schema( load_xml(""" <?xml version="1.0"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/" targetNamespace="http://tests.python-zeep.org/" elementFormDefault="qualified"> <element name="container"> <complexType> <sequence> <element minOccurs="0" maxOccurs="1" name="auth" type="anyType" /> <element minOccurs="0" maxOccurs="1" name="params" type="anyType" /> </sequence> </complexType> </element> </schema> """)) schema.set_ns_prefix('tns', 'http://tests.python-zeep.org/') KeyValueData = xsd.Element( '{http://xml.apache.org/xml-soap}KeyValueData', xsd.ComplexType( xsd.Sequence([ xsd.Element( 'key', xsd.AnyType(), ), xsd.Element( 'value', xsd.AnyType(), ), ]), ), ) Map = xsd.ComplexType( xsd.Sequence([ xsd.Element('item', xsd.AnyType(), min_occurs=1, max_occurs="unbounded"), ]), qname=etree.QName('{http://xml.apache.org/xml-soap}Map')) header_Username = KeyValueData(xsd.AnyObject(xsd.String(), 'Username'), value=xsd.AnyObject(xsd.String(), 'abc')) header_ShopId = KeyValueData(xsd.AnyObject(xsd.String(), 'ShopId'), value=xsd.AnyObject(xsd.Int(), 123)) auth = Map(item=[header_Username, header_ShopId]) header_LimitNum = KeyValueData(xsd.AnyObject(xsd.String(), 'LimitNum'), value=xsd.AnyObject(xsd.Int(), 2)) params = Map(item=[header_LimitNum]) container = schema.get_element('ns0:container') obj = container(auth=auth, params=params) result = render_node(container, obj) expected = load_xml(""" <document> <ns0:container xmlns:ns0="http://tests.python-zeep.org/"> <ns0:auth xmlns:ns1="http://xml.apache.org/xml-soap" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns1:Map"> <item> <key xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Username</key> <value xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">abc</value> </item> <item> <key xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">ShopId</key> <value xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:int">123</value> </item> </ns0:auth> <ns0:params xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:Map"> <item> <key xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">LimitNum</key> <value xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:int">2</value> </item> </ns0:params> </ns0:container> </document> """) # noqa assert_nodes_equal(result, expected)