Zoeken…


Opmerkingen

Niet alle elementen van de XML-invoer worden als elementen van de geparseerde structuur. Momenteel slaat deze module XML-opmerkingen, verwerkingsinstructies en documenttype-verklaringen in de invoer over. Desalniettemin kunnen bomen gebouwd met behulp van de API van deze module in plaats van parseren uit XML-tekst opmerkingen en verwerkingsinstructies bevatten; ze worden opgenomen bij het genereren van XML-uitvoer.

Openen en lezen met een ElementTree

Importeer het ElementTree-object, open het relevante .xml-bestand en haal de root-tag op:

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

Er zijn een paar manieren om door de boom te zoeken. Ten eerste is iteratie:

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

Anders kunt u naar specifieke locaties verwijzen, zoals een lijst:

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

Gebruik de .find of .findall om naar specifieke tags op naam te zoeken:

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

Een XML-bestand wijzigen

Importeer Element Tree module en open xml-bestand, verkrijg een xml-element

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

Element-object kan worden gemanipuleerd door de velden te wijzigen, attributen toe te voegen en te wijzigen, kinderen toe te voegen en te verwijderen

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

Als u een element wilt verwijderen, gebruikt u de methode Element.remove ()

root.remove(element)

ElementTree.write () -methode die wordt gebruikt om het xml-object uit te voeren naar xml-bestanden.

tree.write('output.xml')

Maak en bouw XML-documenten

Element Tree-module importeren

import xml.etree.ElementTree as ET

De functie Element () wordt gebruikt om XML-elementen te maken

p=ET.Element('parent')

SubElement () functie gebruikt om subelementen te maken voor een Give-element

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

dump () functie wordt gebruikt om xml-elementen te dumpen.

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

Als u in een bestand wilt opslaan, maakt u een XML-structuur met de ElementTree () -functie en gebruikt u de methode write () om in een bestand op te slaan.

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

De functie Comment () wordt gebruikt om opmerkingen in het XML-bestand in te voegen.

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

Grote XML-bestanden openen en lezen met iterparse (incrementele parsing)

Soms willen we niet het hele XML-bestand laden om de informatie te krijgen die we nodig hebben. In deze gevallen is het nuttig om de relevante secties stapsgewijs te laden en ze vervolgens te verwijderen wanneer we klaar zijn. Met de iterparse-functie kunt u de elementstructuur bewerken die is opgeslagen tijdens het parseren van de XML.

Importeer het ElementTree-object:

import xml.etree.ElementTree as ET

Open het .xml-bestand en herhaal alle elementen:

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

Als alternatief kunnen we alleen zoeken naar specifieke gebeurtenissen, zoals start- / eindtags of naamruimten. Als deze optie wordt weggelaten (zoals hierboven), worden alleen 'einde'-gebeurtenissen geretourneerd:

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

Hier is het complete voorbeeld dat laat zien hoe elementen uit de geheugenstructuur worden gewist wanneer we hiermee klaar zijn:

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 ...

Zoeken in de XML met XPath

Vanaf versie 2.7 biedt ElementTree betere ondersteuning voor XPath-zoekopdrachten. XPath is een syntaxis waarmee u door een XML kunt navigeren, zoals SQL wordt gebruikt om door een database te zoeken. Zowel de find en findall functies te ondersteunen XPath. De onderstaande xml wordt voor dit voorbeeld gebruikt

 <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>

Zoeken naar alle boeken:

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

Zoeken naar het boek met titel = 'De kleur van magie':

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

Zoeken naar het boek met id = 5:

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

Zoek naar het tweede boek:

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

Zoeken naar het laatste boek:

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

Zoeken naar alle auteurs:

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow