Reputation: 32511
I have a string containing XML data that is returned from an http request.
I am using ElementTree to parse the data, and I want to then search recursively for an element.
According to this question, I can only search recursively with result.findall()
if result
is of type ElementTree
rather than type Element
.
Now xml.etree.ElementTree.fromstring()
, used to parse the string, returns an Element
object, while xml.etree.ElementTree.parse()
, used to parse a file, returns an ElementTree
object.
My question is then: How can I parse the string and get an ElementTree
instance? (without any madness like writing to a temporary file)
Upvotes: 22
Views: 21530
Reputation: 120568
Turn your string into a file-like object and use ElementTree.parse
:
from xml.etree import ElementTree
from cStringIO import StringIO
tree = ElementTree.parse(StringIO(string))
Upvotes: 8
Reputation: 40374
When you use ElementTree.fromstring()
what you're getting back is basically the root of the tree, so if you create a new tree like this ElementTree.ElementTree(root)
you'll get you're looking for.
So, to make it clearer:
from xml.etree import ElementTree
tree = ElementTree.ElementTree(ElementTree.fromstring(<your_xml_string>))
or:
from xml.etree.ElementTree import fromstring, ElementTree
tree = ElementTree(fromstring(<your_xml_string>))
Upvotes: 32