Stap 2: Parsing XML met Python
Wat bedoelen we met het ontleden?
Parsing verwijst naar de syntactische analyse van de XML-inbreng in de samenstellende delen ter vergemakkelijking van de uitvoering van code gebaseerd op het resultaat van de analyse. Met andere woorden, is het programma "lezen" de XML om te zoeken naar waarden die het zoekt, met aandacht voor de juiste syntaxis en vorm. XML-syntaxis bevat een geneste hiërarchie van elementen. Dit betekent dat elk niveau van de hiërarchie geleverd als een volledig gesloten deelverzameling van het vorige niveau wordt. In ons voorbeeld hieronder, elk object is volledig ingesloten ("genest") in de. Deze nesten zo ver omlaag als u nodig hebt, kunt u uitbreiden. Wanneer u schrijft parseren code deze nesten meestal resulteert in for-lussen in Python doorlopen van alle objecten op een niveau in de hiërarchie.
Opties voor het parsen van XML in Python
Er zijn vele verschillende pakketten voor het parsen van XML in Python. We zullen xml.etree.ElementTree gebruiken. ElementTree is een eenvoudig te gebruiken, snel XML-boom bibliotheek ingebouwd in Python. Het is enigszins beperkt in functies, maar voor eenvoudige XML message parsing het is moeilijk te verslaan.
Wat moet u weten over ElementTree? Zeer weinig opdrachten zijn nodig om een eenvoudige XML parseren. Deze paar worden hieronder geïllustreerd.
Python-voorbeeldcode
import xml.etree.ElementTree as ET
incomingXML = """ <XMLObjectXMLRequests>
<XMLCOMMAND> <OBJECTSERVERID>W-1</OBJECTSERVERID> <OBJECTNAME>StatusWebView</OBJECTNAME> <OBJECTTYPE>1</OBJECTTYPE> <OBJECTID>7</OBJECTID>
</XMLCOMMAND> <XMLCOMMAND>
<OBJECTSERVERID>M-2</OBJECTSERVERID> <OBJECTNAME>Processes</OBJECTNAME> <OBJECTTYPE>64</OBJECTTYPE> <OBJECTID>0</OBJECTID>
</XMLCOMMAND>
</XMLObjectXMLRequests>"""
root = ET.fromstring(incomingXML) print incomingXML
# iterate through all the values for element in root.findall('XMLCOMMAND'):
print 'XMLCOMMAND' print 'OBJECTNAME:',\
element.find('OBJECTNAME').text print 'OBJECTTYPE:',\
element.find('OBJECTTYPE').text print 'OBJECTSERVERID:',\
element.find('OBJECTSERVERID').text print 'OBJECTID:',\
element.find('OBJECTID').text
Setup de ElementTree-gegevens
Na de invoer van de code ElementTree en het schrijven van het XML-bestand naar een tekenreeks (Opmerking: je kan dit lezen vanuit een bestand of een webaanvraag), we eerst instellen naar de hoofdmap van de XML-hiërarchie. De wortel van deze XML-code is.
De lijst doorlopen
We weten uit te kijken naar het XML-bestand, dat uit een aantal objecten bestaat. We gebruiken een for-lus om dit te doen (elk element binnen de hoofdmap is een object) met behulp van de ElementTree opdracht findall (alle XMLCOMMAND objecten zoeken in dit geval).
Parseren van de afzonderlijke items
In het interieur van de for-lus, ontleden we nu de afzonderlijke elementen van het object. Hier opdracht wij ElementTree element met het kenmerk tekst. Merk op dat de elementen niet in dezelfde volgorde zijn! XML geeft niet als elementen op hetzelfde niveau in een bepaalde volgorde. Bovendien is het niet gegarandeerd dat het eerste element de eerste opgehaald door ElementTree zijn zal.
Verwachte elementen kunnen ontbreken van objecten. In het geval van ontbrekende elementen in Python (met behulp van ElementTree) absoluut moet u een indien verklaring te behandelen van het ontbrekende element. Als u
doen niet dan u het risico een Python-uitzondering veroorzaakt wanneer het in werking op de geretourneerde waarde zoals ElementTree een geen en niet een geldige waarde als resultaat gegeven. Als u tekenreeksen als waarden gebruikt, zal u waarschijnlijk wilt uw string-variabele ingesteld op een "" (lege tekenreeks) in plaats van te worden ingesteld op een Python geen. Dit is een zeer vaak voorkomende fout in ElementTree code te schrijven.
if (element.find('XXXX').text == None): #do something
Toepassingen voor XML in Python programma 's
XML wordt veel gebruikt in de software-industrie, variërend van HL7 berichten in de gezondheidszorg, SOAP Simple Object Access Protocol () voor de uitwisseling van de informatie van de client / server-, en zelfs XML wordt gebruikt in Microsoft Word-bestanden. De belangrijkste voordelen van het gebruik van XML zijn kruis systeem gebruik, leesbaarheid, uitbreidbaarheid en de mogelijkheid van het bewerken van het XML-bestand in een teksteditor.
Programmeurs maken vaak gebruik van XML te lezen en schrijven van configuratiebestanden aan de schijf, snelheidsovertredingen foutopsporing en ontwikkeling. Dit maakt het gemakkelijker om in te stellen test suites voor programma's zoals je de dezelfde XML-structuren van de schijf lezen kunt als u via het Internet in een webaanvraag verzenden wilt. De uitbreidbaarheid van XML kunt u nieuwe parameters en structuren in uw Python programma's toevoegen, terwijl behoud van achterwaartse compatibiliteit. Deel III van deze serie zal tonen hoe dit wordt gedaan in Python.
Conclusie
XML is langdradig en als gevolg daarvan maakt gebruik van een eerlijke beetje van schijfruimte voor het opslaan en geheugen te verwerken. In de wereld van de Raspberry Pi en via het Internet dit in het algemeen maakt niet uit. Echter, in zoals de Arduino microcontrollers, RAM geheugenruimte is op een premie, zodat een meer "dichte" en eenvoudige protocol zoals JSON is meer geschikt. Als er onvoldoende schijfruimte beschikbaar is op een premie, gecomprimeerd XML zeer goed vanwege alle het dupliceren van trefwoorden en beschrijvingen.
XML is gemakkelijk te lezen, ontleden en debug voor beginners en ervaren programmeurs gelijk.