summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorxmo-odoo <xmo@odoo.com>2020-03-03 13:38:32 +0100
committerGitHub <noreply@github.com>2020-03-03 13:38:32 +0100
commiteabf1db31c3a78602c8ece7a3b19e82a99e12ebb (patch)
tree70511a452afb0d104d1849607928bbda3d995bfd /src
parent5a143cca4dfc160a01415acb6a2304ede41a95ca (diff)
downloadpython-lxml-eabf1db31c3a78602c8ece7a3b19e82a99e12ebb.tar.gz
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.
Diffstat (limited to 'src')
-rw-r--r--src/lxml/etree.pyx2
-rw-r--r--src/lxml/tests/test_etree.py24
2 files changed, 26 insertions, 0 deletions
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('<a xmlns:x="X" xmlns:y="Y"><x:b><c/></x:b><b/><c><x:b/><b/></c><b/></a>')))
+ 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