diff -r 1c792a3e4763 Lib/xml/etree/ElementTree.py --- a/Lib/xml/etree/ElementTree.py Thu Jun 14 21:54:24 2012 +0200 +++ b/Lib/xml/etree/ElementTree.py Thu Jun 14 23:56:12 2012 +0300 @@ -202,6 +202,26 @@ tail = None # text after end tag, if any + ## + # (Attribute) Whether or not the element's tag should be closed + # using the long method regardless of whether or not it would be + # possible to close the tag with ' />'. Used by ElementTree only. + + force_long_close = False + + ## + # (Attribute) Whether or not the closing tag preference above + # should propagate to child elements. Used by ElementTree only. + + long_close_propagate = False + + ## + # (Attribute) Whether or not a parent may override this element's + # force_long_close or long_close_propagate values. + # Used by ElemenentTree only + + parent_can_override = True + # constructor def __init__(self, tag, attrib={}, **extra): @@ -213,6 +233,9 @@ self.tag = tag self.attrib = attrib self._children = [] + self.force_long_close = False + self.long_close_propagate = False + self.parent_can_override = True def __repr__(self): return "" % (repr(self.tag), id(self)) @@ -238,6 +261,9 @@ elem.text = self.text elem.tail = self.tail elem[:] = self + elem.force_long_close = self.force_long_close + elem.long_close_propagate = self.long_close_propagate + elem.parent_can_override = self.parent_can_override return elem ## @@ -820,7 +846,8 @@ encoding=None, xml_declaration=None, default_namespace=None, - method=None): + method=None, + use_long_xml_tags=None): # assert self._root is not None if not method: method = "xml" @@ -864,9 +891,25 @@ if method == "text": _serialize_text(write, self._root) else: + old_force_long_close = None + old_long_close_propagate = None + if method == "xml": + if use_long_xml_tags is not None: + old_force_long_close = self._root.force_long_close + old_long_close_propagate = self._root.long_close_propagate + if use_long_xml_tags is True: + self._root.force_long_close = True + self._root.long_close_propagate = True + elif use_long_xml_tags is False: + self._root.force_long_close = False + self._root.long_close_propagate = True qnames, namespaces = _namespaces(self._root, default_namespace) serialize = _serialize[method] serialize(write, self._root, qnames, namespaces) + if old_force_long_close is not None: + self._root.force_long_close = old_force_long_close + if old_long_close_propagate is not None: + self._root.long_close_propagate = old_long_close_propagate if file_or_filename is not file: file.close() @@ -955,7 +998,18 @@ if text: write(_escape_cdata(text)) for e in elem: + old_force_long_close = None + old_long_close_propagate = None + if elem.long_close_propagate is True and e.parent_can_override is True: + old_force_long_close = e.force_long_close + old_long_close_propagate = e.long_close_propagate + e.force_long_close = elem.force_long_close + e.long_close_propagate = elem.long_close_propagate _serialize_xml(write, e, qnames, None) + if old_force_long_close is not None: + e.force_long_close = old_force_long_close + if old_long_close_propagate is not None: + e.long_close_propagate = old_long_close_propagate else: write("<" + tag) items = list(elem.items()) @@ -977,12 +1031,23 @@ else: v = _escape_attrib(v) write(" %s=\"%s\"" % (qnames[k], v)) - if text or len(elem): + if text or len(elem) or elem.force_long_close: write(">") if text: write(_escape_cdata(text)) for e in elem: + old_force_long_close = None + old_long_close_propagate = None + if elem.long_close_propagate is True and e.parent_can_override is True: + old_force_long_close = e.force_long_close + old_long_close_propagate = e.long_close_propagate + e.force_long_close = elem.force_long_close + e.long_close_propagate = elem.long_close_propagate _serialize_xml(write, e, qnames, None) + if old_force_long_close is not None: + e.force_long_close = old_force_long_close + if old_long_close_propagate is not None: + e.long_close_propagate = old_long_close_propagate write("") else: write(" />") diff -r 1c792a3e4763 Modules/_elementtree.c --- a/Modules/_elementtree.c Thu Jun 14 21:54:24 2012 +0200 +++ b/Modules/_elementtree.c Thu Jun 14 23:56:12 2012 +0300 @@ -238,6 +238,12 @@ PyObject *weakreflist; /* For tp_weaklistoffset */ + PyObject* force_long_close; + + PyObject* long_close_propagate; + + PyObject* parent_can_override; + } ElementObject; static PyTypeObject Element_Type; @@ -264,6 +270,15 @@ self->extra->allocated = STATIC_CHILDREN; self->extra->children = self->extra->_children; + Py_INCREF(Py_False); + self->force_long_close = Py_False; + + Py_INCREF(Py_False); + self->long_close_propagate = Py_False; + + Py_INCREF(Py_True); + self->parent_can_override = Py_True; + return 0; } @@ -290,6 +305,12 @@ PyObject_Free(myextra->children); PyObject_Free(myextra); + + Py_DECREF(self->force_long_close); + + Py_DECREF(self->long_close_propagate); + + Py_DECREF(self->parent_can_override); } /* Convenience internal function to create new Element objects with the given @@ -323,6 +344,15 @@ self->weakreflist = NULL; + Py_INCREF(Py_False); + self->force_long_close = Py_False; + + Py_INCREF(Py_False); + self->long_close_propagate = Py_False; + + Py_INCREF(Py_True); + self->parent_can_override = Py_True; + ALLOC(sizeof(ElementObject), "create element"); PyObject_GC_Track(self); return (PyObject*) self; @@ -344,6 +374,15 @@ e->extra = NULL; e->weakreflist = NULL; + + Py_INCREF(Py_False); + e->force_long_close = Py_False; + + Py_INCREF(Py_False); + e->long_close_propagate = Py_False; + + Py_INCREF(Py_True); + e->parent_can_override = Py_True; } return (PyObject *)e; } @@ -754,6 +793,18 @@ } + Py_DECREF(JOIN_OBJ(element->force_long_close)); + element->force_long_close = self->force_long_close; + Py_INCREF(JOIN_OBJ(element->force_long_close)); + + Py_DECREF(JOIN_OBJ(element->long_close_propagate)); + element->long_close_propagate = self->long_close_propagate; + Py_INCREF(JOIN_OBJ(element->long_close_propagate)); + + Py_DECREF(JOIN_OBJ(element->parent_can_override)); + element->parent_can_override = self->parent_can_override; + Py_INCREF(JOIN_OBJ(element->parent_can_override)); + return (PyObject*) element; }