Sök…


Anmärkningar

Inte alla element i XML-ingången kommer att hamna som element i det parsade trädet. För närvarande hoppar denna modul över alla XML-kommentarer, behandlingsinstruktioner och deklarationer av dokumenttyp i ingången. Trots byggda med hjälp av den här modulens API snarare än att analysera från XML-text kan kommentarer och behandlingsinstruktioner finnas i dem. de kommer att inkluderas vid generering av XML-utdata.

Öppna och läsa med en ElementTree

Importera ElementTree-objektet, öppna den relevanta .xml-filen och få root-taggen:

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

Det finns några sätt att söka igenom trädet. Först är det genom iteration:

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

Annars kan du referera till specifika platser som en lista:

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

För att söka efter specifika taggar efter namn använder du .find eller .findall :

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

Ändra en XML-fil

Importera Element Tree-modulen och öppna xml-filen, få ett 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

Elementobjekt kan manipuleras genom att ändra dess fält, lägga till och ändra attribut, lägga till och ta bort barn

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

Om du vill ta bort ett element använder du metoden Element.remove ()

root.remove(element)

ElementTree.write () -metoden som används för att mata ut xml-objekt till xml-filer.

tree.write('output.xml')

Skapa och bygg XML-dokument

Importera Element Tree-modulen

import xml.etree.ElementTree as ET

Element () -funktionen används för att skapa XML-element

p=ET.Element('parent')

Funktionen SubElement () som används för att skapa underelement till ett geelement

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

dump () -funktionen används för att dumpa xml-element.

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

Om du vill spara i en fil skapar du ett xml-träd med funktionen ElementTree () och för att spara till en fil använder du skrivmetoden ()

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

Funktionen Kommentar () används för att infoga kommentarer i xml-filen.

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

Öppna och läsa stora XML-filer med iterparse (inkrementell parsing)

Ibland vill vi inte ladda hela XML-filen för att få den information vi behöver. I dessa fall är det användbart att kunna ladda relevanta avsnitt stegvis och sedan ta bort dem när vi är färdiga. Med iterparse-funktionen kan du redigera elementträdet som är lagrat när du analyserar XML.

Importera ElementTree-objektet:

import xml.etree.ElementTree as ET

Öppna .xml-filen och iterera över alla element:

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

Alternativt kan vi bara leta efter specifika händelser, till exempel start- / sluttaggar eller namnutrymmen. Om det här alternativet utelämnas (som ovan) returneras bara "slut" -händelser:

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

Här är det fullständiga exemplet som visar hur man rensar element från minnet trädet när vi är färdiga med dem:

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

Söka i XML med XPath

Från och med version 2.7 har ElementTree ett bättre stöd för XPath-frågor. XPath är en syntax så att du kan navigera genom en xml som SQL används för att söka igenom en databas. Både find och findall funktioner stöder XPath. Xml nedan kommer att användas för detta exempel

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

Söker efter alla böcker:

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

Söker efter boken med titeln 'The Magic of Magic':

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

Söker efter boken med id = 5:

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

Sök efter den andra boken:

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

Sök efter den sista boken:

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

Sök efter alla författare:

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow