Skip to content

Commit 6ecfc28

Browse files
committed
bpo-54873: Backported namespaces prefixes support for xml.sax.expatreader from PyXml (0.8.4)
1 parent 10fbcd6 commit 6ecfc28

File tree

2 files changed

+34
-7
lines changed

2 files changed

+34
-7
lines changed

Lib/test/test_xml_expatreader.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import unittest
2+
3+
from xml.sax.expatreader import create_parser
4+
from xml.sax import handler
5+
6+
7+
class feature_namespace_prefixes(unittest.TestCase):
8+
def setUp(self):
9+
self.parser = create_parser()
10+
self.parser.setFeature(handler.feature_namespaces, 1)
11+
self.parser.setFeature(handler.feature_namespace_prefixes, 1)
12+
13+
def test_prefix_given(self):
14+
class Handler(handler.ContentHandler):
15+
def startElementNS(self, name, qname, attrs):
16+
self.qname = qname
17+
18+
h = Handler()
19+
20+
self.parser.setContentHandler(h)
21+
self.parser.feed("<Q:E xmlns:Q='http://example.org/testuri'/>")
22+
self.parser.close()
23+
print("self.assertEqual")
24+
self.assertFalse(h.qname is None)

Lib/xml/sax/expatreader.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ def __init__(self, namespaceHandling=0, bufsize=2**16-20):
9191
self._entity_stack = []
9292
self._external_ges = 0
9393
self._interning = None
94+
self._namespace_prefixes = 1
9495

9596
# XMLReader methods
9697

@@ -126,8 +127,9 @@ def getFeature(self, name):
126127
return self._namespaces
127128
elif name == feature_string_interning:
128129
return self._interning is not None
129-
elif name in (feature_validation, feature_external_pes,
130-
feature_namespace_prefixes):
130+
elif name == feature_namespace_prefixes:
131+
return self._namespace_prefixes
132+
elif name in (feature_validation, feature_external_pes):
131133
return 0
132134
elif name == feature_external_ges:
133135
return self._external_ges
@@ -147,6 +149,8 @@ def setFeature(self, name, state):
147149
self._interning = {}
148150
else:
149151
self._interning = None
152+
elif name == feature_namespace_prefixes:
153+
self._namespace_prefixes = state
150154
elif name == feature_validation:
151155
if state:
152156
raise SAXNotSupportedException(
@@ -155,10 +159,6 @@ def setFeature(self, name, state):
155159
if state:
156160
raise SAXNotSupportedException(
157161
"expat does not read external parameter entities")
158-
elif name == feature_namespace_prefixes:
159-
if state:
160-
raise SAXNotSupportedException(
161-
"expat does not report namespace prefixes")
162162
else:
163163
raise SAXNotRecognizedException(
164164
"Feature '%s' not recognized" % name)
@@ -333,11 +333,14 @@ def start_element_ns(self, name, attrs):
333333
pair = name.split()
334334
if len(pair) == 1:
335335
# no namespace
336+
elem_qname = name
336337
pair = (None, name)
337338
elif len(pair) == 3:
339+
elem_qname = "%s:%s" % (pair[2], pair[1])
338340
pair = pair[0], pair[1]
339341
else:
340342
# default namespace
343+
elem_qname = pair[1]
341344
pair = tuple(pair)
342345

343346
newattrs = {}
@@ -360,7 +363,7 @@ def start_element_ns(self, name, attrs):
360363
newattrs[apair] = value
361364
qnames[apair] = qname
362365

363-
self._cont_handler.startElementNS(pair, None,
366+
self._cont_handler.startElementNS(pair, elem_qname,
364367
AttributesNSImpl(newattrs, qnames))
365368

366369
def end_element_ns(self, name):

0 commit comments

Comments
 (0)