def test_encode_unordered_content_2(self): """Here we test with a default converter at the schema level""" schema = self.get_schema(""" <xs:element name="A" type="A_type" /> <xs:complexType name="A_type" mixed="true"> <xs:sequence> <xs:element name="B1" type="xs:string"/> <xs:element name="B2" type="xs:integer"/> <xs:element name="B3" type="xs:boolean"/> </xs:sequence> </xs:complexType> """, converter=UnorderedConverter) self.check_encode( xsd_component=schema.elements['A'], data=ordered_dict_class([('B2', 10), ('B1', 'abc'), ('B3', True)]), expected=u'<A>\n<B1>abc</B1>\n<B2>10</B2>\n<B3>true</B3>\n</A>', indent=0, cdata_prefix='#' ) self.check_encode( xsd_component=schema.elements['A'], data=ordered_dict_class([('B1', 'abc'), ('B2', 10), ('#1', 'hello'), ('B3', True)]), expected=u'<A>\nhello<B1>abc</B1>\n<B2>10</B2>\n<B3>true</B3>\n</A>', indent=0, cdata_prefix='#' ) self.check_encode( xsd_component=schema.elements['A'], data=ordered_dict_class([('B1', 'abc'), ('B2', 10), ('#1', 'hello')]), expected=XMLSchemaValidationError, indent=0, cdata_prefix='#' )
def test_complex_elements(self): schema = self.get_schema(""" <element name="A" type="ns:A_type" /> <complexType name="A_type" mixed="true"> <simpleContent> <extension base="string"> <attribute name="a1" type="short" use="required"/> <attribute name="a2" type="negativeInteger"/> </extension> </simpleContent> </complexType> """) self.check_encode( schema.elements['A'], data={'@a1': 10, '@a2': -1, '$': 'simple '}, expected='<ns:A xmlns:ns="ns" a1="10" a2="-1">simple </ns:A>' ) self.check_encode( schema.elements['A'], {'@a1': 10, '@a2': -1, '$': 'simple '}, etree_fromstring('<A xmlns="ns" a1="10" a2="-1">simple </A>'), ) self.check_encode( schema.elements['A'], {'@a1': 10, '@a2': -1}, etree_fromstring('<A xmlns="ns" a1="10" a2="-1"/>') ) self.check_encode( schema.elements['A'], {'@a1': 10, '$': 'simple '}, etree_fromstring('<A xmlns="ns" a1="10">simple </A>') ) self.check_encode(schema.elements['A'], {'@a2': -1, '$': 'simple '}, XMLSchemaValidationError) schema = self.get_schema(""" <element name="A" type="ns:A_type" /> <complexType name="A_type"> <sequence> <element name="B1" type="string"/> <element name="B2" type="integer"/> <element name="B3" type="boolean"/> </sequence> </complexType> """) self.check_encode( xsd_component=schema.elements['A'], data=ordered_dict_class([('B1', 'abc'), ('B2', 10), ('B3', False)]), expected=u'<ns:A xmlns:ns="ns">\n<B1>abc</B1>\n<B2>10</B2>\n<B3>false</B3>\n </ns:A>', indent=0, ) self.check_encode(schema.elements['A'], {'B1': 'abc', 'B2': 10, 'B4': False}, XMLSchemaValidationError) self.check_encode( xsd_component=schema.elements['A'], data=ordered_dict_class([('B1', 'abc'), ('B2', 10), ('#1', 'hello')]), expected=u'<ns:A xmlns:ns="ns">\n<B1>abc</B1>\n<B2>10</B2>hello\n </ns:A>', indent=0, cdata_prefix='#' )
def test_unordered_converter_repeated_sequence_of_elements(self): schema = self.get_schema(""" <xs:element name="foo"> <xs:complexType> <xs:sequence minOccurs="1" maxOccurs="2"> <xs:element name="A" minOccurs="0" type="xs:integer" nillable="true" /> <xs:element name="B" minOccurs="0" type="xs:integer" nillable="true" /> </xs:sequence> </xs:complexType> </xs:element> """) root = schema.to_etree( ordered_dict_class([('A', [1, 2]), ('B', [3, 4])])) self.assertListEqual([e.text for e in root], ['1', '3', '2', '4']) root = schema.to_etree({ "A": [1, 2], "B": [3, 4] }, converter=UnorderedConverter) self.assertListEqual([e.text for e in root], ['1', '3', '2', '4']) root = schema.to_etree({"A": [1, 2], "B": [3, 4]}, unordered=True) self.assertListEqual([e.text for e in root], ['1', '3', '2', '4'])
def test_cdata_decoding(self): schema = xmlschema.XMLSchema(self.casepath('issues/issue_046/issue_046.xsd')) xml_file = self.casepath('issues/issue_046/issue_046.xml') self.assertEqual( schema.decode(xml_file, dict_class=ordered_dict_class, cdata_prefix='#'), ordered_dict_class( [('@xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'), ('@xsi:noNamespaceSchemaLocation', 'issue_046.xsd'), ('#1', 'Dear Mr.'), ('name', 'John Smith'), ('#2', '.\n Your order'), ('orderid', 1032), ('#3', 'will be shipped on'), ('shipdate', '2001-07-13'), ('#4', '.')] ))
def test_complex_elements(self): schema = self.get_schema(""" <xs:element name="A" type="A_type" /> <xs:complexType name="A_type" mixed="true"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="a1" type="xs:short" use="required"/> <xs:attribute name="a2" type="xs:negativeInteger"/> </xs:extension> </xs:simpleContent> </xs:complexType> """) self.check_encode( schema.elements['A'], data={'@a1': 10, '@a2': -1, '$': 'simple '}, expected='<A a1="10" a2="-1">simple </A>', ) self.check_encode( schema.elements['A'], {'@a1': 10, '@a2': -1, '$': 'simple '}, ElementTree.fromstring('<A a1="10" a2="-1">simple </A>'), ) self.check_encode( schema.elements['A'], {'@a1': 10, '@a2': -1}, ElementTree.fromstring('<A a1="10" a2="-1"/>') ) self.check_encode( schema.elements['A'], {'@a1': 10, '$': 'simple '}, ElementTree.fromstring('<A a1="10">simple </A>') ) self.check_encode(schema.elements['A'], {'@a2': -1, '$': 'simple '}, XMLSchemaValidationError) schema = self.get_schema(""" <xs:element name="A" type="A_type" /> <xs:complexType name="A_type"> <xs:sequence> <xs:element name="B1" type="xs:string"/> <xs:element name="B2" type="xs:integer"/> <xs:element name="B3" type="xs:boolean"/> </xs:sequence> </xs:complexType> """) self.check_encode( xsd_component=schema.elements['A'], data=ordered_dict_class([('B1', 'abc'), ('B2', 10), ('B3', False)]), expected=u'<A>\n<B1>abc</B1>\n<B2>10</B2>\n<B3>false</B3>\n</A>', indent=0, ) self.check_encode(schema.elements['A'], {'B1': 'abc', 'B2': 10, 'B4': False}, XMLSchemaValidationError)
def test_sort_content(self): # test of ModelVisitor's sort_content/iter_unordered_content schema = self.get_schema(""" <xs:element name="A" type="A_type" /> <xs:complexType name="A_type"> <xs:sequence> <xs:element name="B1" type="xs:string"/> <xs:element name="B2" type="xs:integer"/> <xs:element name="B3" type="xs:boolean"/> </xs:sequence> </xs:complexType> """) model = ModelVisitor(schema.types['A_type'].content_type) self.assertListEqual( model.sort_content([('B2', 10), ('B1', 'abc'), ('B3', True)]), [('B1', 'abc'), ('B2', 10), ('B3', True)]) self.assertListEqual( model.sort_content([('B3', True), ('B2', 10), ('B1', 'abc')]), [('B1', 'abc'), ('B2', 10), ('B3', True)]) self.assertListEqual( model.sort_content([('B2', 10), ('B4', None), ('B1', 'abc'), ('B3', True)]), [('B1', 'abc'), ('B2', 10), ('B3', True), ('B4', None)]) content = [('B2', 10), ('B4', None), ('B1', 'abc'), (1, 'hello'), ('B3', True)] self.assertListEqual(model.sort_content(content), [(1, 'hello'), ('B1', 'abc'), ('B2', 10), ('B3', True), ('B4', None)]) content = [(2, 'world!'), ('B2', 10), ('B4', None), ('B1', 'abc'), (1, 'hello'), ('B3', True)] self.assertListEqual(model.sort_content(content), [(1, 'hello'), ('B1', 'abc'), (2, 'world!'), ('B2', 10), ('B3', True), ('B4', None)]) # With a dict-type argument content = ordered_dict_class([('B2', [10]), ('B1', ['abc']), ('B3', [True])]) self.assertListEqual(model.sort_content(content), [('B1', 'abc'), ('B2', 10), ('B3', True)]) content = ordered_dict_class([('B2', [10]), ('B1', ['abc']), ('B3', [True]), (1, 'hello')]) self.assertListEqual(model.sort_content(content), [(1, 'hello'), ('B1', 'abc'), ('B2', 10), ('B3', True)]) # With partial content self.assertListEqual(model.sort_content([]), []) self.assertListEqual(model.sort_content([('B1', 'abc')]), [('B1', 'abc')]) self.assertListEqual(model.sort_content([('B2', 10)]), [('B2', 10)]) self.assertListEqual(model.sort_content([('B3', True)]), [('B3', True)]) self.assertListEqual(model.sort_content([('B3', True), ('B1', 'abc')]), [('B1', 'abc'), ('B3', True)]) self.assertListEqual(model.sort_content([('B2', 10), ('B1', 'abc')]), [('B1', 'abc'), ('B2', 10)]) self.assertListEqual(model.sort_content([('B3', True), ('B2', 10)]), [('B2', 10), ('B3', True)])