Szukaj…


Uwagi

Nie wszystkie elementy danych wejściowych XML staną się elementami przeanalizowanego drzewa. Obecnie moduł ten pomija wszelkie komentarze XML, instrukcje przetwarzania i deklaracje typów dokumentów w danych wejściowych. Niemniej jednak drzewa zbudowane przy użyciu interfejsu API tego modułu zamiast analizowania z tekstu XML mogą zawierać komentarze i instrukcje przetwarzania; zostaną one uwzględnione podczas generowania danych wyjściowych XML.

Otwieranie i czytanie za pomocą ElementTree

Zaimportuj obiekt ElementTree, otwórz odpowiedni plik .xml i uzyskaj znacznik root:

import xml.etree.ElementTree as ET
tree = ET.parse("yourXMLfile.xml")
root = tree.getroot()

Istnieje kilka sposobów przeszukiwania drzewa. Pierwszy to iteracja:

for child in root:
    print(child.tag, child.attrib)

W przeciwnym razie możesz odwoływać się do określonych lokalizacji, takich jak lista:

print(root[0][1].text)

Aby wyszukać określone tagi według nazwy, użyj .find lub .findall :

print(root.findall("myTag"))
print(root[0].find("myOtherTag"))

Modyfikowanie pliku XML

Zaimportuj moduł Drzewo elementów i otwórz plik xml, uzyskaj element xml

import xml.etree.ElementTree as ET
tree = ET.parse('sample.xml')
root=tree.getroot()
element = root[0] #get first child of root element

Obiektem elementu można manipulować, zmieniając jego pola, dodając i modyfikując atrybuty, dodając i usuwając elementy potomne

element.set('attribute_name', 'attribute_value') #set the attribute to xml element
element.text="string_text"

Jeśli chcesz usunąć element, użyj metody Element.remove ()

root.remove(element)

Metoda ElementTree.write () używana do wyprowadzania obiektu xml do plików xml.

tree.write('output.xml')

Twórz i buduj dokumenty XML

Moduł importu drzewa elementów

import xml.etree.ElementTree as ET

Funkcja Element () służy do tworzenia elementów XML

p=ET.Element('parent')

Funkcja SubElement () używana do tworzenia podelementów dla elementu give

c = ET.SubElement(p, 'child1')

Funkcja dump () służy do zrzutu elementów xml.

ET.dump(p)
# Output will be like this
#<parent><child1 /></parent>

Jeśli chcesz zapisać do pliku, utwórz drzewo xml za pomocą funkcji ElementTree () i aby zapisać do pliku użyj metody write ()

tree = ET.ElementTree(p)
tree.write("output.xml")

Funkcja Comment () służy do wstawiania komentarzy w pliku xml.

comment = ET.Comment('user comment')
p.append(comment) #this comment will be appended to parent element

Otwieranie i czytanie dużych plików XML przy użyciu iterparse (przyrostowe parsowanie)

Czasami nie chcemy załadować całego pliku XML, aby uzyskać potrzebne informacje. W takich przypadkach przydatna jest możliwość stopniowego ładowania odpowiednich sekcji, a następnie ich usuwania po zakończeniu. Dzięki funkcji iterparse możesz edytować drzewo elementów, które jest przechowywane podczas analizowania XML.

Zaimportuj obiekt ElementTree:

import xml.etree.ElementTree as ET

Otwórz plik .xml i powtórz wszystkie elementy:

for event, elem in ET.iterparse("yourXMLfile.xml"):
    ... do something ...

Alternatywnie możemy szukać tylko określonych zdarzeń, takich jak tagi początkowe / końcowe lub przestrzenie nazw. Jeśli ta opcja zostanie pominięta (jak wyżej), zwracane są tylko zdarzenia „końcowe”:

events=("start", "end", "start-ns", "end-ns")
for event, elem in ET.iterparse("yourXMLfile.xml", events=events):
    ... do something ...

Oto kompletny przykład pokazujący, jak usunąć elementy z drzewa w pamięci, gdy skończymy z nimi:

for event, elem in ET.iterparse("yourXMLfile.xml", events=("start","end")):        
    if elem.tag == "record_tag" and event == "end":
        print elem.text
        elem.clear()
    ... do something else ...

Przeszukiwanie XML za pomocą XPath

Począwszy od wersji 2.7 ElementTree ma lepszą obsługę zapytań XPath. XPath to składnia umożliwiająca poruszanie się po pliku XML, podobnie jak SQL służy do przeszukiwania bazy danych. Obie funkcje find i findall obsługują XPath. Poniższy kod XML zostanie użyty w tym przykładzie

 <Catalog>
    <Books>
        <Book id="1" price="7.95">
            <Title>Do Androids Dream of Electric Sheep?</Title>
            <Author>Philip K. Dick</Author>
        </Book>
        <Book id="5" price="5.95">
            <Title>The Colour of Magic</Title>
            <Author>Terry Pratchett</Author>
        </Book>
        <Book id="7" price="6.95">
            <Title>The Eye of The World</Title>
            <Author>Robert Jordan</Author>
        </Book>
    </Books>
</Catalog>

Wyszukiwanie wszystkich książek:

import xml.etree.cElementTree as ET
tree = ET.parse('sample.xml')
tree.findall('Books/Book')

Wyszukiwanie książki o tytule = „Kolor magii”:

tree.find("Books/Book[Title='The Colour of Magic']") 
# always use '' in the right side of the comparison

Wyszukiwanie książki o id = 5:

tree.find("Books/Book[@id='5']")
# searches with xml attributes must have '@' before the name

Wyszukaj drugą książkę:

tree.find("Books/Book[2]")
# indexes starts at 1, not 0

Wyszukaj ostatnią książkę:

tree.find("Books/Book[last()]")
# 'last' is the only xpath function allowed in ElementTree

Wyszukaj wszystkich autorów:

tree.findall(".//Author")
#searches with // must use a relative path


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow