def to_xml(self, encoding="UTF-8", pretty=True): dom = Document() dom.version = "1.0" dom.encoding = "UTF-8" doc_type = DocumentType("plist") doc_type.publicId = "-//Apple Computer//DTD PLIST 1.0//EN" doc_type.systemId = "http://www.apple.com/DTDs/PropertyList-1.0.dtd" dom.appendChild(doc_type) plist_node = dom.createElement("plist") plist_node.setAttribute("version", "1.0") dom.appendChild(plist_node) plist_root = dom.createElement("dict") plist_node.appendChild(plist_root) temp_pairs = [(self, plist_root)] while temp_pairs: data, root = temp_pairs.pop(0) if isinstance(data, dict): for k, v in data.items(): k_node = dom.createElement("key") text_node = dom.createTextNode(k) k_node.appendChild(text_node) root.appendChild(k_node) if isinstance(v, dict): v_node = dom.createElement("dict") temp_pairs.append((v, v_node)) elif isinstance(v, list): v_node = dom.createElement("array") temp_pairs.append((v, v_node)) else: v_node = self._to_dom_node(v, dom) root.appendChild(v_node) elif isinstance(data, list): for v in data: if isinstance(v, dict): v_node = dom.createElement("dict") temp_pairs.append((v, v_node)) elif isinstance(v, list): v_node = dom.createElement("array") temp_pairs.append((v, v_node)) else: v_node = self._to_dom_node(v, dom) root.appendChild(v_node) else: data_node = self._to_dom_node(data, dom) root.appendChild(data_node) if pretty: xml_content = dom.toprettyxml(encoding=encoding) else: xml_content = dom.toxml(encoding=encoding) return xml_content