summaryrefslogtreecommitdiff
path: root/src/lxml
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2020-01-02 12:24:20 +0100
committerStefan Behnel <stefan_ml@behnel.de>2020-01-02 12:24:20 +0100
commit41cc5f378e2454ff1cabe5d227242cce211a3a2b (patch)
treefd3180bc816375a38dceb3760c9fb9b6076bb4c5 /src/lxml
parent7432362b539fde2c90780e86cb749a40ec017e7a (diff)
downloadpython-lxml-41cc5f378e2454ff1cabe5d227242cce211a3a2b.tar.gz
LP#1857794: Tail text of nodes that get removed from a document using item deletion disappeared silently instead of sticking with the node that was removed.
Diffstat (limited to 'src/lxml')
-rw-r--r--src/lxml/etree.pyx1
-rw-r--r--src/lxml/tests/test_elementtree.py28
2 files changed, 28 insertions, 1 deletions
diff --git a/src/lxml/etree.pyx b/src/lxml/etree.pyx
index 1859386c..c4d1d9db 100644
--- a/src/lxml/etree.pyx
+++ b/src/lxml/etree.pyx
@@ -782,7 +782,6 @@ cdef public class _Element [ type LxmlElementType, object LxmlElement ]:
c_node = _findChild(self._c_node, x)
if c_node is NULL:
raise IndexError, f"index out of range: {x}"
- _removeText(c_node.next)
_removeNode(self._doc, c_node)
def __deepcopy__(self, memo):
diff --git a/src/lxml/tests/test_elementtree.py b/src/lxml/tests/test_elementtree.py
index 820d7591..78d8964d 100644
--- a/src/lxml/tests/test_elementtree.py
+++ b/src/lxml/tests/test_elementtree.py
@@ -1689,15 +1689,28 @@ class _ETreeTestCaseBase(HelperTestCase):
self.assertEqual('{http://huhu}bump1', foo[0][0].tag)
self.assertEqual('{http://huhu}bump2', foo[0][1].tag)
+ def test_delitem_tail_dealloc(self):
+ ElementTree = self.etree.ElementTree
+ f = BytesIO('<a><b></b>B2<c></c>C2</a>')
+ doc = ElementTree(file=f)
+ a = doc.getroot()
+ del a[0]
+ self.assertXML(
+ _bytes('<a><c></c>C2</a>'),
+ a)
+
def test_delitem_tail(self):
ElementTree = self.etree.ElementTree
f = BytesIO('<a><b></b>B2<c></c>C2</a>')
doc = ElementTree(file=f)
a = doc.getroot()
+ b, c = a
del a[0]
self.assertXML(
_bytes('<a><c></c>C2</a>'),
a)
+ self.assertEqual("B2", b.tail)
+ self.assertEqual("C2", c.tail)
def test_clear(self):
Element = self.etree.Element
@@ -2383,15 +2396,30 @@ class _ETreeTestCaseBase(HelperTestCase):
[b, d],
list(a))
+ def test_delslice_child_tail_dealloc(self):
+ ElementTree = self.etree.ElementTree
+ f = BytesIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>')
+ doc = ElementTree(file=f)
+ a = doc.getroot()
+ del a[1:3]
+ self.assertXML(
+ _bytes('<a><b></b>B2<e></e>E2</a>'),
+ a)
+
def test_delslice_child_tail(self):
ElementTree = self.etree.ElementTree
f = BytesIO('<a><b></b>B2<c></c>C2<d></d>D2<e></e>E2</a>')
doc = ElementTree(file=f)
a = doc.getroot()
+ b, c, d, e = a
del a[1:3]
self.assertXML(
_bytes('<a><b></b>B2<e></e>E2</a>'),
a)
+ self.assertEqual("B2", b.tail)
+ self.assertEqual("C2", c.tail)
+ self.assertEqual("D2", d.tail)
+ self.assertEqual("E2", e.tail)
def test_delslice_tail(self):
XML = self.etree.XML