views:

177

answers:

3

Im trying to output some data from my google app engine datastore to xml so that a flash file can read it,

The problem is when using CDATA tags the outputted xml contains &lt; instead of <

e.g

<name>&lt;![CDATA][name]]&gt;</name>

here is my python which outputs the xml:

    doc = Document()

    feed = doc.createElement("feed")
    doc.appendChild(feed)
    tags_element = doc.createElement("names")
    feed.appendChild(tags_element)
    copen = "<![CDATA]["
    cclose = "]]>"

    tags = db.GqlQuery("SELECT * FROM Tag ORDER BY date DESC")

    for tag in tags:
        tag_element = doc.createElement("name")
        tags_element.appendChild(tag_element)
        the_tag = doc.createTextNode("%s%s%s" % (copen,str(tag.thetag), cclose))
        tag_element.appendChild(the_tag)

    self.response.headers["Content-Type"] = "application/xml"
    self.response.out.write(doc.toprettyxml(indent="    "))

i know this is an encoding issue just can't seem to get to the route of the problem,

thanks in advance

A: 

To do what you are attempting, you need to actually add a CDATA-block using the appropriate minidom methods. It's not an encoding issue, per se, but when you use createTextNode it encodes XML control characters to actual text characters for you, in order to be helpful, no doubt.

Williham Totland
ah i see, do you know how to do this with minidom, googling isn't coming up with anything
Alex
A: 

createTextNode converts reserved chars (< > &) into entities.

Delan Azabani
+3  A: 

It seems the createCDATASection method works for me.

for tag in tags:
    tag_element = doc.createCDATASection(tag.thetag)
    tags_element.appendChild(tag_element)
Jason R. Coombs
perfect thank you!
Alex