215

The ElementTree.parse reads from a file, how can I use this if I already have the XML data in a string?

Maybe I am missing something here, but there must be a way to use the ElementTree without writing out the string to a file and reading it again.

xml.etree.elementtree

0

4 Answers 4

358

You can parse the text as a string, which creates an Element, and create an ElementTree using that Element.

import xml.etree.ElementTree as ET
tree = ET.ElementTree(ET.fromstring(xmlstring))

I just came across this issue and the documentation, while complete, is not very straightforward on the difference in usage between the parse() and fromstring() methods.

Sign up to request clarification or add additional context in comments.

3 Comments

The second line can be simply root = ET.fromstring(xmlstring). Equals ET.parse('file.xml').getroot(): docs.python.org/3.6/library/…
@Anton, as the OP states, the idea is to generate an ElementTree, and not an Element. This is useful, for instance, when you want to use ElementTree.write().
If anyone is curious this also works for lxml
117

If you're using xml.etree.ElementTree.parse to parse from a file, then you can use xml.etree.ElementTree.fromstring to get the root Element of the document. Often you don't actually need an ElementTree.

See xml.etree.ElementTree

8 Comments

The problem is that ElementTree.fromstring generates an element, and not an ElementTree! Anyone knows how to work around this?
Same problem as @SamuelLampa mentioned. I is not a ElementTree, I am not able to do getroot() for this
@SamuelLampa see dgassaway's answer, use ET.ElementTree(ET.fromstring(xmlstring))
for the correct answer, see the one provided by @dgassaway
Don't forget the import statements
|
21

You need the xml.etree.ElementTree.fromstring(text)

from xml.etree.ElementTree import XML, fromstring
myxml = fromstring(text)

1 Comment

Yes, but this is not an ElementTree it is the root Element. This API is different and can't do all the same things.
13

io.StringIO is another option for getting XML into xml.etree.ElementTree:

import io
f = io.StringIO(xmlstring)
tree = ET.parse(f)
root = tree.getroot()

Hovever, it does not affect the XML declaration one would assume to be in tree (although that's needed for ElementTree.write()). See How to write XML declaration using xml.etree.ElementTree.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.