ElementTree.XML(string XML) and ElementTree.fromstring(string XML) not working

unayok unayok at gmail.com
Thu Jun 25 22:47:36 EDT 2009


On Jun 25, 9:02 pm, Kee Nethery <k... at kagi.com> wrote:
> Summary: I have XML as string and I want to pull it into ElementTree
> so that I can play with it but it is not working for me. XML and
> fromstring when used with a string do not do the same thing as parse
> does with a file. How do I get this to work?
>
> Details:
> I have a CGI that receives XML via an HTTP POST as a POST variable
> named 'theXml'. The POST data is a string that the CGI receives, it is
> not a file on a hard disk.
>
> The POSTed string looks like this when viewed in pretty format:
[...]
> et.parse seems to pull in the entire XML document and give me
> something to play with whereas et.XML and et.fromstring do not.
>
> Questions:
> How do I get this to work?
> Where in the docs did it give me an example of how to make this work
> (what did I miss from reading the docs)?
>
[skipping bonus points question]

I'm not sure what you're expecting.  It looks to me like things are
working okay:

My test script:

import xml.etree.ElementTree as ET

data="""<xml>
        <purchase id="1" lang="en">
                <item id="1" productId="369369">
                        <name>Autumn</name>
                        <quantity>1</quantity>
                        <price>8.46</price>
                </item>
                <javascript>YES</javascript>
        </purchase>
        <customer id="123456" time="1227449322">
                <shipping>
                        <street>19 Any Street</street>
                        <city>Berkeley</city>
                        <state>California</state>
                        <zip>12345</zip>
                        <country>People's Republic of Berkeley</
country>
                        <name>Jon Roberts</name>
                </shipping>
                <email>ju... at shrimp.edu</email>
        </customer>
</xml>"""

xml = ET.fromstring( data )

print xml
print "attrib   ", xml.attrib
print "tag      ", xml.tag
print "text     ", xml.text
print "contents "
for element in xml :
    print element
print "tostring"
print ET.tostring( xml )

when run, produces:

<Element xml at 7f582c2e82d8>
attrib    {}
tag       xml
text

contents
<Element purchase at 7f582c2e8320>
<Element customer at 7f582c2e85a8>
tostring
<xml>
        <purchase id="1" lang="en">
                <item id="1" productId="369369">
                        <name>Autumn</name>
                        <quantity>1</quantity>
                        <price>8.46</price>
                </item>
                <javascript>YES</javascript>
        </purchase>
        <customer id="123456" time="1227449322">
                <shipping>
                        <street>19 Any Street</street>
                        <city>Berkeley</city>
                        <state>California</state>
                        <zip>12345</zip>
                        <country>People's Republic of Berkeley</
country>
                        <name>Jon Roberts</name>
                </shipping>
                <email>ju... at shrimp.edu</email>
        </customer>
</xml>

Which seems to me quite useful (i.e. it has the full XML available).
Maybe you can explain how you were trying to "play with" the results
of fromstring() that you can't do from parse().

The documentation for elementtree indicates:

> The ElementTree wrapper type adds code to load XML files as trees
> of Element objects, and save them back again.

and

> The Element type can be used to represent XML files in memory.
> The ElementTree wrapper class is used to read and write XML files.

In the above case, you should find that the getroot() of your loaded
ElementTree instance ( parse().getroot() ) to be the same as the
Element generated by fromstring().



More information about the Python-list mailing list