From eabf1db31c3a78602c8ece7a3b19e82a99e12ebb Mon Sep 17 00:00:00 2001 From: xmo-odoo Date: Tue, 3 Mar 2020 13:38:32 +0100 Subject: Make iter() work with qnames (GH-298) "QName" is supposed to be usable anywhere a tag name is expected and iter() should take any number of tag names for filtering, but before this change passing a QName to iter() results in an exception. --- src/lxml/etree.pyx | 2 ++ src/lxml/tests/test_etree.py | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) (limited to 'src') diff --git a/src/lxml/etree.pyx b/src/lxml/etree.pyx index c4d1d9db..b4467548 100644 --- a/src/lxml/etree.pyx +++ b/src/lxml/etree.pyx @@ -2741,6 +2741,8 @@ cdef class _MultiTagMatcher: elif href == b'*': href = None # wildcard: any namespace, including none self._py_tags.append((href, name)) + elif isinstance(tag, QName): + self._storeTags(tag.text, seen) else: # support a sequence of tags for item in tag: diff --git a/src/lxml/tests/test_etree.py b/src/lxml/tests/test_etree.py index b997e4d8..3d8dee1c 100644 --- a/src/lxml/tests/test_etree.py +++ b/src/lxml/tests/test_etree.py @@ -3266,6 +3266,30 @@ class ETreeOnlyTestCase(HelperTestCase): self.assertRaises(ValueError, tree.getelementpath, d1) self.assertRaises(ValueError, tree.getelementpath, d2) + def test_elementtree_iter_qname(self): + XML = self.etree.XML + ElementTree = self.etree.ElementTree + QName = self.etree.QName + tree = ElementTree(XML( + _bytes(''))) + self.assertEqual( + list(tree.iter(QName("b"))), + list(tree.iter("b")), + ) + self.assertEqual( + list(tree.iter(QName("X", "b"))), + list(tree.iter("{X}b")), + ) + + self.assertEqual( + [e.tag for e in tree.iter(QName("X", "b"), QName("b"))], + ['{X}b', 'b', '{X}b', 'b', 'b'] + ) + self.assertEqual( + list(tree.iter(QName("X", "b"), QName("b"))), + list(tree.iter("{X}b", "b")) + ) + def test_elementtree_find_qname(self): XML = self.etree.XML ElementTree = self.etree.ElementTree -- cgit v1.2.1