Python Language
Manipulowanie XML
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