def _serialize_xml(write, elem, qnames, namespaces): tag = elem.tag text = elem.text if tag is etree.Comment: write("<!--%s-->" % text) elif tag is etree.ProcessingInstruction: write("<?%s?>" % text) else: tag = qnames[tag] if tag is None: if text: write(etree._escape_cdata(text)) for e in elem: etree._serialize_xml(write, e, qnames, None) else: write("<" + tag) items = list(elem.items()) if items or namespaces: if namespaces: for v, k in sorted( namespaces.items(), key=lambda x: x[1]): # sort on prefix if k: k = ":" + k write(" xmlns%s=\"%s\"" % (k, etree._escape_attrib(v))) for k, v in list(items): # no !!!! lexical order if isinstance(k, etree.QName): k = k.text if isinstance(v, etree.QName): v = qnames[v.text] else: v = etree._escape_attrib(v) write(" %s=\"%s\"" % (qnames[k], v)) if text or len(elem): write(">") if text: write(etree._escape_cdata(text)) for e in elem: etree._serialize_xml(write, e, qnames, None) write("</" + tag + ">") else: write(" />") if elem.tail: write(etree._escape_cdata(elem.tail))