MCPcopy
hub / github.com/scrapy/scrapy / XmlItemExporter

Class XmlItemExporter

scrapy/exporters.py:167–221  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

165
166
167class XmlItemExporter(BaseItemExporter):
168 def __init__(self, file: BytesIO, **kwargs: Any):
169 self.item_element = kwargs.pop("item_element", "item")
170 self.root_element = kwargs.pop("root_element", "items")
171 super().__init__(**kwargs)
172 if not self.encoding:
173 self.encoding = "utf-8"
174 self.xg = XMLGenerator(file, encoding=self.encoding)
175
176 def _beautify_newline(self, new_item: bool = False) -> None:
177 if self.indent is not None and (self.indent > 0 or new_item):
178 self.xg.characters("\n")
179
180 def _beautify_indent(self, depth: int = 1) -> None:
181 if self.indent:
182 self.xg.characters(" " * self.indent * depth)
183
184 def start_exporting(self) -> None:
185 self.xg.startDocument()
186 self.xg.startElement(self.root_element, AttributesImpl({}))
187 self._beautify_newline(new_item=True)
188
189 def export_item(self, item: Any) -> None:
190 self._beautify_indent(depth=1)
191 self.xg.startElement(self.item_element, AttributesImpl({}))
192 self._beautify_newline()
193 for name, value in self._get_serialized_fields(item, default_value=""):
194 self._export_xml_field(name, value, depth=2)
195 self._beautify_indent(depth=1)
196 self.xg.endElement(self.item_element)
197 self._beautify_newline(new_item=True)
198
199 def finish_exporting(self) -> None:
200 self.xg.endElement(self.root_element)
201 self.xg.endDocument()
202
203 def _export_xml_field(self, name: str, serialized_value: Any, depth: int) -> None:
204 self._beautify_indent(depth=depth)
205 self.xg.startElement(name, AttributesImpl({}))
206 if hasattr(serialized_value, "items"):
207 self._beautify_newline()
208 for subname, value in serialized_value.items():
209 self._export_xml_field(subname, value, depth=depth + 1)
210 self._beautify_indent(depth=depth)
211 elif is_listlike(serialized_value):
212 self._beautify_newline()
213 for value in serialized_value:
214 self._export_xml_field("value", value, depth=depth + 1)
215 self._beautify_indent(depth=depth)
216 elif isinstance(serialized_value, str):
217 self.xg.characters(serialized_value)
218 else:
219 self.xg.characters(str(serialized_value))
220 self.xg.endElement(name)
221 self._beautify_newline()
222
223
224class CsvItemExporter(BaseItemExporter):

Callers 2

_get_exporterMethod · 0.90
assertExportResultMethod · 0.90

Calls

no outgoing calls

Tested by 2

_get_exporterMethod · 0.72
assertExportResultMethod · 0.72