diff options
| author | Stefan Behnel <stefan_ml@behnel.de> | 2022-02-14 20:20:22 +0100 |
|---|---|---|
| committer | Stefan Behnel <stefan_ml@behnel.de> | 2022-02-14 20:20:22 +0100 |
| commit | ec2b2e5ae83bd7fae4f32dc6737dea64de58cc37 (patch) | |
| tree | af26b9203021fbc66e009b5705179a24f7bd5b9c /src/lxml | |
| parent | f7bb07b5f68fede97754685dad076cd7b7442bac (diff) | |
| download | python-lxml-ec2b2e5ae83bd7fae4f32dc6737dea64de58cc37.tar.gz | |
Allow QName as tag value in ElementMaker, not just strings.
Diffstat (limited to 'src/lxml')
| -rw-r--r-- | src/lxml/builder.pxd | 1 | ||||
| -rw-r--r-- | src/lxml/builder.py | 6 | ||||
| -rw-r--r-- | src/lxml/tests/test_builder.py | 19 |
3 files changed, 24 insertions, 2 deletions
diff --git a/src/lxml/builder.pxd b/src/lxml/builder.pxd index f6b2fb5f..efd8beb5 100644 --- a/src/lxml/builder.pxd +++ b/src/lxml/builder.pxd @@ -2,6 +2,7 @@ cdef object ET cdef object partial +cdef type _QName cdef class ElementMaker: cdef readonly dict _nsmap diff --git a/src/lxml/builder.py b/src/lxml/builder.py index a2888456..e0fcf747 100644 --- a/src/lxml/builder.py +++ b/src/lxml/builder.py @@ -42,6 +42,7 @@ The ``E`` Element factory for generating XML documents. from __future__ import absolute_import import lxml.etree as ET +_QName = ET.QName from functools import partial @@ -203,7 +204,10 @@ class ElementMaker(object): def __call__(self, tag, *children, **attrib): typemap = self._typemap - if self._namespace is not None and tag[0] != '{': + if not isinstance(tag, str) and isinstance(tag, _QName): + # A QName is explicitly qualified, do not look at self._namespace. + tag = tag.text + elif self._namespace is not None and tag[0] != '{': tag = self._namespace + tag elem = self._makeelement(tag, nsmap=self._nsmap) if attrib: diff --git a/src/lxml/tests/test_builder.py b/src/lxml/tests/test_builder.py index 04184ce9..b1ad4ebf 100644 --- a/src/lxml/tests/test_builder.py +++ b/src/lxml/tests/test_builder.py @@ -9,7 +9,7 @@ from __future__ import absolute_import import unittest from lxml import etree -from lxml.builder import E +from lxml.builder import E, ElementMaker from lxml.html.builder import E as HE from .common_imports import HelperTestCase, _bytes @@ -42,6 +42,23 @@ class BuilderTestCase(HelperTestCase): ) self.assertEqual("TexT", html.findtext(".//p")) + def test_qname_tag(self): + p = E(etree.QName("http://lxml.de/nsp", "p"), "xyz") + self.assertEqual(p.tag, "{http://lxml.de/nsp}p") + + def test_qname_tag_default_namespace(self): + em = ElementMaker(namespace="http://python.org") + + p = em(etree.QName("http://lxml.de/nsp", "p"), "xyz") + self.assertEqual(p.tag, "{http://lxml.de/nsp}p") + + p = em("{http://lxml.de/nsp}p", "xyz") + self.assertEqual(p.tag, "{http://lxml.de/nsp}p") + + # safety check + p = em("p", "xyz") + self.assertEqual(p.tag, "{http://python.org}p") + def test_suite(): suite = unittest.TestSuite() |
