summaryrefslogtreecommitdiff
path: root/src/lxml
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2022-02-14 20:20:22 +0100
committerStefan Behnel <stefan_ml@behnel.de>2022-02-14 20:20:22 +0100
commitec2b2e5ae83bd7fae4f32dc6737dea64de58cc37 (patch)
treeaf26b9203021fbc66e009b5705179a24f7bd5b9c /src/lxml
parentf7bb07b5f68fede97754685dad076cd7b7442bac (diff)
downloadpython-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.pxd1
-rw-r--r--src/lxml/builder.py6
-rw-r--r--src/lxml/tests/test_builder.py19
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()