gh-149571: Fix the C implementation of Element.itertext() (GH-149929)

It no longer emits text for comments and processing instructions.
This commit is contained in:
Serhiy Storchaka 2026-05-27 13:23:28 +03:00 committed by GitHub
parent 776573c9f0
commit 7de4fcd445
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 32 additions and 0 deletions

View file

@ -3663,6 +3663,32 @@ def test_basic(self):
doc = ET.XML("<root>a&amp;<sub>b&amp;</sub>c&amp;</root>")
self.assertEqual(''.join(doc.itertext()), 'a&b&c&')
def test_comment(self):
e = ET.Element('root')
e.text = 'before'
comment = ET.Comment('comment')
self.assertEqual(comment.text, 'comment')
comment.tail = 'after'
e.append(comment)
self.assertEqual(''.join(e.itertext()), 'beforeafter')
self.assertEqual(list(e.iter()), [e, comment])
self.assertEqual(list(e.iter('root')), [e])
self.assertEqual(''.join(comment.itertext()), '')
self.assertEqual(list(comment.iter()), [comment])
def test_processinginstruction(self):
e = ET.Element('root')
e.text = 'before'
pi = ET.PI('test', 'instruction')
self.assertEqual(pi.text, 'test instruction')
pi.tail = 'after'
e.append(pi)
self.assertEqual(''.join(e.itertext()), 'beforeafter')
self.assertEqual(list(e.iter()), [e, pi])
self.assertEqual(list(e.iter('root')), [e])
self.assertEqual(''.join(pi.itertext()), '')
self.assertEqual(list(pi.iter()), [pi])
def test_corners(self):
# single root, no subelements
a = ET.Element('a')

View file

@ -0,0 +1,2 @@
Fix the C implementation of :meth:`xml.etree.ElementTree.Element.itertext`:
it no longer emits text for comments and processing instructions.

View file

@ -2297,6 +2297,10 @@ elementiter_next(PyObject *op)
return NULL;
}
if (it->gettext) {
if (elem->tag != Py_None && !PyUnicode_Check(elem->tag)) {
Py_DECREF(elem);
continue;
}
text = element_get_text(elem);
goto gettext;
}