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