Python xml ElementTree из источника строки?

118

ElementTree.parse читает из файла, как я могу использовать это, если у меня уже есть данные XML в строке?

Возможно, мне что-то здесь не хватает, но должен быть способ использовать ElementTree, не записывая строку в файл и не читая ее снова.

xml.etree.elementtree

Джордж
источник
2
Привет, Джордж, было бы здорово, если бы ты принял второй ответ (dgassaway) как правильный.
famargar

Ответы:

89

Если вы используете xml.etree.ElementTree.parseдля синтаксического анализа из файла, вы можете использовать xml.etree.ElementTree.fromstringдля синтаксического анализа текста.

См. Xml.etree.ElementTree

Джим Х.
источник
38
Проблема в том, что ElementTree.fromstring генерирует элемент, а не ElementTree! Кто-нибудь знает, как это обойти?
Samuel Lampa
4
Та же проблема, что и @SamuelLampa. Я не ElementTree, я не в состоянии сделать getroot()для этого
Сиддхарт Менон
23
@SamuelLampa см . Ответ dgassaway , используйтеET.ElementTree(ET.fromstring(xmlstring))
Колин Пикард
6
за правильный ответ, увидеть один предоставленный @dgassaway
2,718
Не забудьте
про
227

Вы можете проанализировать текст как строку, которая создает элемент, и создать ElementTree, используя этот элемент.

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

Я просто наткнулся на этот вопрос и документации, в то время как полная, не очень просто на разнице в использовании между parse()и fromstring()методами.

dgassaway
источник
5
Вторая строчка может быть просто root = ET.fromstring(xmlstring). Равно ET.parse('file.xml').getroot(): docs.python.org/3.6/library/…
Антон Тарасенко
3
@Anton, как заявляет OP, идея состоит в том, чтобы сгенерировать ElementTree, а не Element. Это полезно, например, когда вы хотите использовать ElementTree.write ().
batbrat
17

Вам нужен xml.etree.ElementTree.fromstring(text)

from xml.etree.ElementTree import XML, fromstring
myxml = fromstring(text)
karlcow
источник
1

io.StringIO - еще один вариант для получения XML в xml.etree.ElementTree :

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

Hovever, это не влияет на объявление XML, которое можно было бы использовать tree(хотя это необходимо для ElementTree.write () ). См. Как написать объявление XML с помощью xml.etree.ElementTree .

ручка
источник