mirror of
https://github.com/scrapy/scrapy.git
synced 2025-02-25 10:03:54 +00:00
XmlItemExporter: added built-in support for exporting multi-valued fields (for convenience)
This commit is contained in:
parent
e8960bf616
commit
56b292e057
@ -240,6 +240,26 @@ XmlItemExporter
|
|||||||
</item>
|
</item>
|
||||||
</items>
|
</items>
|
||||||
|
|
||||||
|
Unless overriden in :meth:`serialize_field` method, multi-valued fields are
|
||||||
|
exported by serializing each value inside a ``<value>`` element. This is for
|
||||||
|
convenience, as multi-valued fields are very common.
|
||||||
|
|
||||||
|
For example, the item::
|
||||||
|
|
||||||
|
Item(name=['John', 'Doe'], age='23')
|
||||||
|
|
||||||
|
Would be serialized as::
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<items>
|
||||||
|
<item>
|
||||||
|
<name>
|
||||||
|
<value>John</value>
|
||||||
|
<value>Doe</value>
|
||||||
|
</name>
|
||||||
|
<age>23</age>
|
||||||
|
</item>
|
||||||
|
</items>
|
||||||
|
|
||||||
CsvItemExporter
|
CsvItemExporter
|
||||||
---------------
|
---------------
|
||||||
|
@ -95,7 +95,11 @@ class XmlItemExporter(BaseItemExporter):
|
|||||||
|
|
||||||
def _export_xml_field(self, name, serialized_value):
|
def _export_xml_field(self, name, serialized_value):
|
||||||
self.xg.startElement(name, {})
|
self.xg.startElement(name, {})
|
||||||
self.xg.characters(serialized_value)
|
if hasattr(serialized_value, '__iter__'):
|
||||||
|
for value in serialized_value:
|
||||||
|
self._export_xml_field('value', value)
|
||||||
|
else:
|
||||||
|
self.xg.characters(serialized_value)
|
||||||
self.xg.endElement(name)
|
self.xg.endElement(name)
|
||||||
|
|
||||||
|
|
||||||
|
@ -137,6 +137,15 @@ class XmlItemExporterTest(BaseItemExporterTest):
|
|||||||
expected_value = '<?xml version="1.0" encoding="utf-8"?>\n<items><item><age>22</age><name>John\xc2\xa3</name></item></items>'
|
expected_value = '<?xml version="1.0" encoding="utf-8"?>\n<items><item><age>22</age><name>John\xc2\xa3</name></item></items>'
|
||||||
self.assertEqual(self.output.getvalue(), expected_value)
|
self.assertEqual(self.output.getvalue(), expected_value)
|
||||||
|
|
||||||
|
def test_multivalued_fields(self):
|
||||||
|
output = StringIO()
|
||||||
|
item = TestItem(name=[u'John\xa3', u'Doe'])
|
||||||
|
ie = XmlItemExporter(output)
|
||||||
|
ie.start_exporting()
|
||||||
|
ie.export_item(item)
|
||||||
|
ie.finish_exporting()
|
||||||
|
expected_value = '<?xml version="1.0" encoding="utf-8"?>\n<items><item><name><value>John\xc2\xa3</value><value>Doe</value></name></item></items>'
|
||||||
|
self.assertEqual(output.getvalue(), expected_value)
|
||||||
|
|
||||||
class JsonLinesItemExporterTest(BaseItemExporterTest):
|
class JsonLinesItemExporterTest(BaseItemExporterTest):
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user