Python xml ElementTree ze źródła ciągu?


118

ElementTree.parse czyta z pliku, jak mogę tego użyć, jeśli mam już dane XML w ciągu?

Może czegoś mi brakuje, ale musi istnieć sposób na użycie elementu ElementTree bez zapisywania ciągu znaków do pliku i ponownego czytania.

xml.etree.elementtree


2
Cześć George, byłoby wspaniale, gdybyś mógł zaakceptować drugą odpowiedź (dgassaway) jako poprawną.
famargar

Odpowiedzi:


89

Jeśli używasz xml.etree.ElementTree.parsedo analizowania z pliku, możesz użyć xml.etree.ElementTree.fromstringdo analizy tekstu.

Zobacz xml.etree.ElementTree


38
Problem polega na tym, że ElementTree.fromstring generuje element, a nie ElementTree! Czy ktoś wie, jak to obejść?
Samuel Lampa,

4
Ten sam problem, o którym wspomniał @SamuelLampa. I nie jest ElementTree, nie jestem w stanie zrobić getroot()tego
Siddharth Menon

23
@SamuelLampa zobacz odpowiedź dgassaway , użyjET.ElementTree(ET.fromstring(xmlstring))
Colin Pickard

6
aby uzyskać poprawną odpowiedź, zobacz tę dostarczoną przez @dgassaway
2.718

Nie zapomnij o oświadczeniach dotyczących importu
Stevoisiak

226

Możesz przeanalizować tekst jako ciąg, który tworzy element, i utworzyć element ElementTree przy użyciu tego elementu.

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

Właśnie natknąłem się na ten problem, a dokumentacja, chociaż jest kompletna, nie jest bardzo prosta w zakresie różnic w użyciu między metodami parse()i fromstring().


5
Druga linia może być prosta root = ET.fromstring(xmlstring). Równa się ET.parse('file.xml').getroot(): docs.python.org/3.6/library/…
Anton Tarasenko

3
@Anton, jak stwierdza OP, chodzi o wygenerowanie drzewa elementu, a nie elementu. Jest to przydatne, na przykład, gdy chcesz użyć ElementTree.write ().
batbrat

17

Potrzebujesz xml.etree.ElementTree.fromstring(text)

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.