Skip to content

Commit 7de4fcd

Browse files
gh-149571: Fix the C implementation of Element.itertext() (GH-149929)
It no longer emits text for comments and processing instructions.
1 parent 776573c commit 7de4fcd

3 files changed

Lines changed: 32 additions & 0 deletions

File tree

Lib/test/test_xml_etree.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3663,6 +3663,32 @@ def test_basic(self):
36633663
doc = ET.XML("<root>a&amp;<sub>b&amp;</sub>c&amp;</root>")
36643664
self.assertEqual(''.join(doc.itertext()), 'a&b&c&')
36653665

3666+
def test_comment(self):
3667+
e = ET.Element('root')
3668+
e.text = 'before'
3669+
comment = ET.Comment('comment')
3670+
self.assertEqual(comment.text, 'comment')
3671+
comment.tail = 'after'
3672+
e.append(comment)
3673+
self.assertEqual(''.join(e.itertext()), 'beforeafter')
3674+
self.assertEqual(list(e.iter()), [e, comment])
3675+
self.assertEqual(list(e.iter('root')), [e])
3676+
self.assertEqual(''.join(comment.itertext()), '')
3677+
self.assertEqual(list(comment.iter()), [comment])
3678+
3679+
def test_processinginstruction(self):
3680+
e = ET.Element('root')
3681+
e.text = 'before'
3682+
pi = ET.PI('test', 'instruction')
3683+
self.assertEqual(pi.text, 'test instruction')
3684+
pi.tail = 'after'
3685+
e.append(pi)
3686+
self.assertEqual(''.join(e.itertext()), 'beforeafter')
3687+
self.assertEqual(list(e.iter()), [e, pi])
3688+
self.assertEqual(list(e.iter('root')), [e])
3689+
self.assertEqual(''.join(pi.itertext()), '')
3690+
self.assertEqual(list(pi.iter()), [pi])
3691+
36663692
def test_corners(self):
36673693
# single root, no subelements
36683694
a = ET.Element('a')
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix the C implementation of :meth:`xml.etree.ElementTree.Element.itertext`:
2+
it no longer emits text for comments and processing instructions.

Modules/_elementtree.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2297,6 +2297,10 @@ elementiter_next(PyObject *op)
22972297
return NULL;
22982298
}
22992299
if (it->gettext) {
2300+
if (elem->tag != Py_None && !PyUnicode_Check(elem->tag)) {
2301+
Py_DECREF(elem);
2302+
continue;
2303+
}
23002304
text = element_get_text(elem);
23012305
goto gettext;
23022306
}

0 commit comments

Comments
 (0)