2011-12-20 3 views
19

У меня есть строка, содержащая XML-данные, которые возвращаются из HTTP-запроса.Python ElementTree: Разбор строки и получение экземпляра ElementTree

Я использую ElementTree для анализа данных, и я хочу, чтобы затем искать рекурсивно для элемента.

По this question, я могу только искать рекурсивно result.findall() если result имеет тип ElementTree, а не типа Element.

Теперь xml.etree.ElementTree.fromstring(), используется для разбора строки, возвращает Element объекта, в то время как xml.etree.ElementTree.parse(), используемые для разбора файла, возвращает ElementTree объекта.

Мой вопрос: как я могу разобрать строку и получить экземпляр ElementTree? (без безумия, как писать временный файл)

ответ

25

При использовании ElementTree.fromstring(), что вы получаете обратно в основном корень дерева, так что если вы создаете новое дерево, как этот ElementTree.ElementTree(root) вы получите вы» ищу.

Таким образом, чтобы сделать его более ясным:

from xml.etree import ElementTree 
tree = ElementTree.ElementTree(ElementTree.fromstring(<your_xml_string>)) 

или:

from xml.etree.ElementTree import fromstring, ElementTree 
tree = ElementTree(fromstring(<your_xml_string>)) 
+0

Я просто хочу add - для тех, кто использует lxml - в lxml (где элемент всегда принадлежит документу/дереву, даже если неявный), вы можете использовать метод getrootttree(). – Steven

+0

Спасибо! Действительно раздражает дизайн API в etree, чтобы иметь разные типы вывода только в зависимости от источника ввода. На самом деле это путано :( –

+0

Это действительно не очень понятно в документации. «Fromstring() анализирует XML из строки непосредственно в элемент, который является корневым элементом разбора дерева. Другие функции парсинга могут создавать ElementTree.» – Snorfalorpagus

6

Включите строку в файл-подобный объект и использовать ElementTree.parse:

from xml.etree import ElementTree 
from cStringIO import StringIO 

tree = ElementTree.parse(StringIO(string)) 
+0

Отлично, это то, что я искал. :-) –