]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-149571: Fix the C implementation of Element.itertext() (GH-149929) (GH...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 27 May 2026 10:49:54 +0000 (12:49 +0200)
committerGitHub <noreply@github.com>
Wed, 27 May 2026 10:49:54 +0000 (10:49 +0000)
It no longer emits text for comments and processing instructions.
(cherry picked from commit 7de4fcd44585f572acbcee23f5c7018b2b3f0983)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Lib/test/test_xml_etree.py
Misc/NEWS.d/next/Library/2026-05-17-02-25-56.gh-issue-149571.LNyuWJ.rst [new file with mode: 0644]
Modules/_elementtree.c

index cd6e5ec40cd49ce2526bcd21ea0ae9be456beda5..51f8a2d52161cc65cac35464ac49727093538020 100644 (file)
@@ -3553,6 +3553,32 @@ class ElementIterTest(unittest.TestCase):
         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')
diff --git a/Misc/NEWS.d/next/Library/2026-05-17-02-25-56.gh-issue-149571.LNyuWJ.rst b/Misc/NEWS.d/next/Library/2026-05-17-02-25-56.gh-issue-149571.LNyuWJ.rst
new file mode 100644 (file)
index 0000000..2b71d9c
--- /dev/null
@@ -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.
index e144ad5699886cfbb3646af517582a218d5fbff0..ef2601bc05ca463262fe2d4222fa725f838ee3f2 100644 (file)
@@ -2264,6 +2264,10 @@ elementiter_next(ElementIterObject *it)
             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;
         }