New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
XMLGenerator.startElementNS dies on EMPTY_NAMESPACE attribut #39586
Comments
from xml.sax.saxutils import XMLGenerator
g = XMLGenerator(encoding='utf8')
STREAM_NAMESPACE = 'http://etherx.jabber.org/streams'
CLIENT_NAMESPACE = 'jabber:client'
g.startDocument()
g.startPrefixMapping('stream', STREAM_NAMESPACE)
g.startPrefixMapping('client', CLIENT_NAMESPACE)
g.startElementNS(
(STREAM_NAMESPACE, 'stream'), 'stream',
{(None,'xmlns'): CLIENT_NAMESPACE}
) Dies with:
Traceback (most recent call last):
File "tst.py", line 11, in ?
g.startElementNS(
File "/System/Library/Frameworks/Python.framework/
Versions/2.3/lib/python2.3/xml/sax/saxutils.py", line 124, in
startElementNS
name = self._current_context[name[0]] + ":" + name[1]
KeyError: 'x' Changing the end of XMLGenerator.startElementNS to the for (name, value) in attrs.items():
if name[0] is None:
name = name[1]
else:
name = self._current_context[name[0]] + ":" +
name[1]
self._out.write(' %s=%s' % (name,
quoteattr(value)))
self._out.write('>') |
Logged In: YES This method also appears to have trouble emmitting tags without a import xml.sax
import xml.sax.handler
import xml.sax.saxutils
x = '''<?xml version="1.0"?><mechanisms xmlns='urn:ietf:
params:xml:ns:xmpp-sasl'
>'''
parser = xml.sax.make_parser()
parser.setFeature(xml.sax.handler.feature_namespaces, True)
parser.setContentHandler(xml.sax.saxutils.XMLGenerator())
parser.feed(x) dies with:
Traceback (most recent call last):
File "tst.py", line 30, in ?
parser.feed(x)
File "/System/Library/Frameworks/Python.framework/Versions/
2.3/lib/python2.3/xml/sax/expatreader.py", line 207, in feed
self._parser.Parse(data, isFinal)
File "/System/Library/Frameworks/Python.framework/Versions/
2.3/lib/python2.3/xml/sax/expatreader.py", line 337, in
start_element_ns
AttributesNSImpl(newattrs, qnames))
File "/System/Library/Frameworks/Python.framework/Versions/
2.3/lib/python2.3/xml/sax/saxutils.py", line 116, in startElementNS
name = self._current_context[name[0]] + ":" + name[1]
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str' I've attached my current replacement startElementNS method |
Logged In: YES I don't understand your second example; it uses saxutils to |
Logged In: YES Never mind my previous comment; I just noticed the |
Logged In: YES Please provide your changes in the form of a patch. |
Logged In: YES This issue lasts for 2.5 years already. I feel like it is The processing of XML namespaces in saxutils.XMLGenerator is import sys
from xml import sax
from xml.sax.saxutils import XMLGenerator
from StringIO import StringIO
tests = [
("No namespace, no attributes", "<a/>"),
("No namespace, with attributes", "<a b='c'/>"),
("Empty prefix, no attributes", "<a xmlns='qux'/>"),
("Empty prefix, unprefixed attributes", "<a xmlns='qux'
b='c'/>"),
("Prefixed, no attributes", "<my:a xmlns:my='qux'/>"),
("Prefixed, unprefixed attributes", "<my:a xmlns:my='qux'
b='c'/>"),
("Prefixed, prefixed attributes", "<my:a xmlns:my='qux'
my:b='c'/>"),
]
for (caption, testdoc) in tests:
try:
parser = sax.make_parser()
parser.setFeature(sax.handler.feature_namespaces, 1)
parser.setContentHandler(XMLGenerator(StringIO()))
parser.parse(StringIO(testdoc))
print caption, "- OK"
except StandardError, e:
print caption, "- FAILED:", e.__class__.__name__ With the current version of saxutils (as of Python 2.4.1), I |
This is now fixed in r53754 and r53755. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: