[XML-SIG] Pyxml: DOM questions, problems with namespaces

Mike Brown mike at skew.org
Thu Jun 1 23:34:44 CEST 2006


Matthias Dorfner wrote:
> 1. some problems creating my xml file with the
> correct double quoted string in the namespace, here one example:
> 
> <?xml version='1.0' encoding='UTF-8'?>
> <request xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
> xmlns:noNameSpaceSchemaLocation='Handle.xsd'>
> 
> I need exactly this output but not single quoted(' -> "). Here's the code

The type of quotes used on attribute values during serialization
depends on the serializer.

If you use the .toxml() method to serialize the document, you'll get
double quotes, I believe. It won't pretty-print though.

print doc.toxml()

<?xml version="1.0"?><request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNameSpaceSchemaLocation="Handle.xsd"/>

xml.dom.ext.Print and PrettyPrint haven't been updated in ages.
Well, they've been updated, but only in 4Suite (where they manifest as
Ft.Xml.Domlette.Print and PrettyPrint), not PyXML. In PyXML they're
hard-coded to use single quotes as attribute delimiters.

I asked on the list a while back if there was any interest in bringing
4Suite's Print/PrettyPrint implementation into PyXML and didn't get much
response. It's the kind of thing where if I want to see it done, I have to
submit patches.

> I use to create this one:
> 
> dom = xml.dom.minidom.getDOMImplementation()
> doc = dom.createDocument(None, "request", None)
> 
> #Get the document element
> msg_elem = doc.documentElement
> 
> #Create an xmlns attributes on the root element
> msg_elem.setAttributeNS(EMPTY_NAMESPACE, "xmlns:xsi",
> "http://www.w3.org/2001/XMLSchema-instance")
> msg_elem.setAttributeNS(EMPTY_NAMESPACE, "xsi:noNameSpaceSchemaLocation",
> "Handle.xsd")

This isn't related to your quoting problem, but you are using the
wrong namespaces. Instead of EMPTY_NAMESPACE you need to do it like this:

msg_elem.setAttributeNS(XMLNS_NAMESPACE, 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance')

msg_elem.setAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'xsi:noNameSpaceSchemaLocation','Handle.xsd')

> 2. I want so post the above created xml structure to a webserver, but I
> need to convert this first to a string, how can I do this? PrettyPrint
> allows only writing this DOM structure to a file. Or is it possible to
> correctly read out this xml file?

A "file" in Python is any file-like object, basically anything with a .read()
and maybe also .write() method for byte strings. This includes the sys.stdin,
stdout, stderr streams.

So to pretty-print to the screen, you could just do

PrettyPrint(doc, sys.stdout)

And to print to a buffer rather than an external file:

f = cStringIO.StringIO()
PrettyPrint(doc, f)

To read from that buffer into a string, s:

s = f.getvalue()

Alternatively:

f.reset()
s = f.read()

To read from an external file:

f = open('yourfile', 'rb')
s = f.read()
f.close()

Always be sure to call close() on your file-like objects when you're done
reading or writing to them. (though not really necessary on sys.stdin, stdout,
stderr)

I don't know what web API you're using, but if you have access to an
object representing the HTTP request, it might have a method that
reads from a stream, in which case you could do something like

PrettyPrint(doc, request.stream)

to print directly to into the request object.

Mike


More information about the XML-SIG mailing list