Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 32bf12e

Browse files
committed
Updated to final Attributes interface (patch 101632).
1 parent e84bf75 commit 32bf12e

2 files changed

Lines changed: 72 additions & 13 deletions

File tree

Lib/xml/sax/expatreader.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
from xml.parsers import expat
2121
from xml.sax import xmlreader
2222

23+
AttributesImpl = xmlreader.AttributesImpl
24+
AttributesNSImpl = xmlreader.AttributesNSImpl
25+
2326
# --- ExpatParser
2427

2528
class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):
@@ -31,7 +34,6 @@ def __init__(self, namespaceHandling=0, bufsize=2**16-20):
3134
self._parser = None
3235
self._namespaces = namespaceHandling
3336
self._parsing = 0
34-
self._attrs = xmlreader.AttributesImpl({}, {})
3537

3638
# XMLReader methods
3739

@@ -137,7 +139,7 @@ def getSystemId(self):
137139

138140
# event handlers
139141
def start_element(self, name, attrs):
140-
self._cont_handler.startElement(name, self._attrs)
142+
self._cont_handler.startElement(name, AttributesImpl(attrs))
141143

142144
def end_element(self, name):
143145
self._cont_handler.endElement(name)
@@ -147,12 +149,23 @@ def start_element_ns(self, name, attrs):
147149
if len(pair) == 1:
148150
pair = (None, name)
149151

150-
self._cont_handler.startElementNS(pair, None, self._attrs)
152+
newattrs = {}
153+
for (aname, value) in attrs.items():
154+
apair = aname.split()
155+
if len(apair) == 1:
156+
apair = (None, aname)
157+
else:
158+
apair = tuple(apair)
159+
160+
newattrs[apair] = value
161+
162+
self._cont_handler.startElementNS(pair, None,
163+
AttributesNSImpl(newattrs, {}))
151164

152165
def end_element_ns(self, name):
153166
pair = name.split()
154167
if len(pair) == 1:
155-
name = (None, name)
168+
pair = (None, name)
156169

157170
self._cont_handler.endElementNS(pair, None)
158171

Lib/xml/sax/xmlreader.py

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ def reset(self):
151151
raise NotImplementedError("This method must be implemented!")
152152

153153
# ===== LOCATOR =====
154+
154155
class Locator:
155156
"""Interface for associating a SAX event with a document
156157
location. A locator object will return valid results only during
@@ -173,11 +174,15 @@ def getSystemId(self):
173174
"Return the system identifier for the current event."
174175
return None
175176

176-
# --- AttributesImpl
177+
# ===== ATTRIBUTESIMPL =====
178+
177179
class AttributesImpl:
178-
def __init__(self, attrs, rawnames):
180+
181+
def __init__(self, attrs):
182+
"""Non-NS-aware implementation.
183+
184+
attrs should be of the form {name : value}."""
179185
self._attrs = attrs
180-
self._rawnames = rawnames
181186

182187
def getLength(self):
183188
return len(self._attrs)
@@ -189,16 +194,23 @@ def getValue(self, name):
189194
return self._attrs[name]
190195

191196
def getValueByQName(self, name):
192-
return self._attrs[self._rawnames[name]]
197+
return self._attrs[name]
193198

194199
def getNameByQName(self, name):
195-
return self._rawnames[name]
196-
200+
if not self._attrs.has_key(name):
201+
raise KeyError
202+
return name
203+
204+
def getQNameByName(self, name):
205+
if not self._attrs.has_key(name):
206+
raise KeyError
207+
return name
208+
197209
def getNames(self):
198210
return self._attrs.keys()
199211

200212
def getQNames(self):
201-
return self._rawnames.keys()
213+
return self._attrs.keys()
202214

203215
def __len__(self):
204216
return len(self._attrs)
@@ -216,20 +228,54 @@ def get(self, name, alternative=None):
216228
return self._attrs.get(name, alternative)
217229

218230
def copy(self):
219-
return self.__class__(self._attrs, self._rawnames)
231+
return self.__class__(self._attrs)
220232

221233
def items(self):
222234
return self._attrs.items()
223235

224236
def values(self):
225237
return self._attrs.values()
226238

239+
# ===== ATTRIBUTESNSIMPL =====
240+
241+
class AttributesNSImpl(AttributesImpl):
242+
243+
def __init__(self, attrs, qnames):
244+
"""NS-aware implementation.
245+
246+
attrs should be of the form {(ns_uri, lname): value, ...}.
247+
qnames of the form {(ns_uri, lname): qname, ...}."""
248+
self._attrs = attrs
249+
self._qnames = qnames
250+
251+
def getValueByQName(self, name):
252+
for (nsname, qname) in self._qnames.items():
253+
if qname == name:
254+
return self._attrs[nsname]
255+
256+
raise KeyError
257+
258+
def getNameByQName(self, name):
259+
for (nsname, qname) in self._qnames.items():
260+
if qname == name:
261+
return nsname
262+
263+
raise KeyError
264+
265+
def getQNameByName(self, name):
266+
return self._qnames[name]
267+
268+
def getQNames(self):
269+
return self._qnames.values()
270+
271+
def copy(self):
272+
return self.__class__(self._attrs, self._qnames)
273+
227274

228275
def _test():
229276
XMLReader()
230277
IncrementalParser()
231278
Locator()
232-
AttributesImpl()
233279

234280
if __name__ == "__main__":
235281
_test()

0 commit comments

Comments
 (0)