diff --git a/onadata/apps/api/tests/viewsets/test_data_viewset.py b/onadata/apps/api/tests/viewsets/test_data_viewset.py index c7cc28e5bf..54f8afcbd7 100644 --- a/onadata/apps/api/tests/viewsets/test_data_viewset.py +++ b/onadata/apps/api/tests/viewsets/test_data_viewset.py @@ -2565,6 +2565,33 @@ def test_data_list_xml_format(self): '') self.assertEqual(expected_xml, returned_xml) + def test_invalid_xml_elements_not_present(self): + """ + Test invalid XML elements such as #text are not present in XML Response + """ + self._make_submission(os.path.join( + self.this_directory, 'fixtures', + 'transportation', 'instances', 'transport_2011-07-25_19-05-49_2', + 'transport_2011-07-25_19-05-49_2.xml')) + media_file = "1335783522563.jpg" + self._make_submission_w_attachment(os.path.join( + self.this_directory, 'fixtures', + 'transportation', 'instances', 'transport_2011-07-25_19-05-49_2', + 'transport_2011-07-25_19-05-49_2.xml'), + os.path.join(self.this_directory, 'fixtures', + 'transportation', 'instances', + 'transport_2011-07-25_19-05-49_2', media_file)) + + view = DataViewSet.as_view({'get': 'list'}) + request = self.factory.get('/', **self.extra) + response = view(request, pk=self.xform.pk, format='xml') + self.assertEqual(response.status_code, 200) + + # Ensure XML is well formed + response.render() + returned_xml = response.content.decode('utf-8') + ET.fromstring(returned_xml) + @override_settings(STREAM_DATA=True) def test_data_list_xml_format_no_data(self): """Test DataViewSet Query list XML""" diff --git a/onadata/apps/main/tests/fixtures/transportation/instances/transport_2011-07-25_19-05-49_2/1335783522563.jpg b/onadata/apps/main/tests/fixtures/transportation/instances/transport_2011-07-25_19-05-49_2/1335783522563.jpg new file mode 100755 index 0000000000..e8d953e387 Binary files /dev/null and b/onadata/apps/main/tests/fixtures/transportation/instances/transport_2011-07-25_19-05-49_2/1335783522563.jpg differ diff --git a/onadata/apps/main/tests/fixtures/transportation/instances/transport_2011-07-25_19-05-49_2/1335783522564.JPG b/onadata/apps/main/tests/fixtures/transportation/instances/transport_2011-07-25_19-05-49_2/1335783522564.JPG new file mode 100755 index 0000000000..e8d953e387 Binary files /dev/null and b/onadata/apps/main/tests/fixtures/transportation/instances/transport_2011-07-25_19-05-49_2/1335783522564.JPG differ diff --git a/onadata/apps/main/tests/fixtures/transportation/instances/transport_2011-07-25_19-05-49_2/1442323232322.jpg b/onadata/apps/main/tests/fixtures/transportation/instances/transport_2011-07-25_19-05-49_2/1442323232322.jpg new file mode 100644 index 0000000000..0bc0af9653 Binary files /dev/null and b/onadata/apps/main/tests/fixtures/transportation/instances/transport_2011-07-25_19-05-49_2/1442323232322.jpg differ diff --git a/onadata/apps/main/tests/fixtures/transportation/instances/transport_2011-07-25_19-05-49_2/transport_2011-07-25_19-05-49_2.xml b/onadata/apps/main/tests/fixtures/transportation/instances/transport_2011-07-25_19-05-49_2/transport_2011-07-25_19-05-49_2.xml new file mode 100755 index 0000000000..a0e4c5cca0 --- /dev/null +++ b/onadata/apps/main/tests/fixtures/transportation/instances/transport_2011-07-25_19-05-49_2/transport_2011-07-25_19-05-49_2.xml @@ -0,0 +1 @@ +none1335783522563.jpguuid:5b2cc313-fc09-437e-8149-fcd32f695d41 diff --git a/onadata/libs/renderers/renderers.py b/onadata/libs/renderers/renderers.py index b8833eea40..297f7de322 100644 --- a/onadata/libs/renderers/renderers.py +++ b/onadata/libs/renderers/renderers.py @@ -408,7 +408,9 @@ def _to_xml(self, xml, data): elif isinstance(data, dict): for key, value in data.items(): - if isinstance(value, (list, tuple)): + if not key: + self._to_xml(xml, value) + elif isinstance(value, (list, tuple)): for v in value: xml.startElement(key, {}) self._to_xml(xml, v) @@ -419,7 +421,6 @@ def _to_xml(self, xml, data): xml.startElement(key, attributes) self._to_xml(xml, value) xml.endElement(key) - else: xml.startElement(key, {}) self._to_xml(xml, value) diff --git a/onadata/libs/serializers/data_serializer.py b/onadata/libs/serializers/data_serializer.py index 495e8ae615..7a3d3cba00 100644 --- a/onadata/libs/serializers/data_serializer.py +++ b/onadata/libs/serializers/data_serializer.py @@ -114,7 +114,7 @@ def to_representation(self, instance): ret = super( DataInstanceXMLSerializer, self).to_representation(instance) if 'xml' in ret: - ret = xmltodict.parse(ret['xml']) + ret = xmltodict.parse(ret['xml'], cdata_key="") # Add Instance attributes to representation instance_attributes = {