XML รจ un linguaggio di markup utilizzato per rappresentare e distribuire strutture di dati che possono essere spesso difficili da creare utilizzando formati tabulari piรน standard.
Fondamentalmente, il formato XML รจ simile all'HTML (che รจ un altro linguaggio di markup, appunto), in quanto i dati sono organizzati in elementi, che definiscono il tipo di informazioni esposte, e ogni elemento contiene il valore effettivo sotto forma di contenuto o attributi.
La pagina XML su Wikipedia offre una n visione completa di tutti i dettagli e aspetti tecnici di questo formato, ma i concetti chiave sono semplici. Ogni informazione รจ delimitata da un tag specifico, come questo:
john@mail.com
A
16
alice@mail.com
B
17
bob@mail.com < / email>
C
16
hannah@mail.com
A
17
In questo esempio, ogni studente รจ rappresentato da un elemento, che ha un nameattributo contenente il nome di uno studente specifico. Ciascuno di questi elementi ha quindi sottoelementi definiti dai tag , e ; tra questi tag รจ presente il contenuto effettivo dei dati riferiti allo studente dato. Supponiamo che questi dati vengano salvati in un file XML chiamato "students.xml".
Possiamo pensare a questa struttura come a un DataFrame panda in cui ogni studente rappresenta un'osservazione, con il suo nameattributo che รจ l'identificatore principale e i sottoelementi sono altre caratteristiche dell'osservazione. Una rappresentazione tabulare di questi dati sarebbe come questa:
Quindi vogliamo trovare un modo per convertire i dati strutturati in XML in una tabella piรน funzionale.
Data la struttura dei file XML, possiamo rappresentarli come un albero, e questo รจ l'approccio utilizzato dal modulo xml.etree.ElementTree Python. L'analisi del nostro file "students.xml" inizia dalla radice dell'albero, ovvero l' elemento, che contiene l'intera struttura dati.
import xml.etree.ElementTree as et
xtree = et.parse("students.xml")
xroot = xtree.getroot()
Ora possiamo iterare attraverso ogni nodo dell'albero, il che significa che otterremo ogni elemento studente e prenderemo il suo nameattributo e tutti i suoi sottoelementi per costruire il nostro dataframe.
for node in xroot:
s_name = node.attrib.get("name")
s_mail = node.find("email").text
s_grade = node.find("grade").text
s_age = node.find("age").text
Per ottenere l' nameattributo utilizziamo la attrib.get()funzione, mentre il contenuto testuale di ogni elemento puรฒ essere recuperato utilizzando la find()funzione dei nodi.
Ogni iterazione restituirร un set di dati che puรฒ essere pensato come un'osservazione in un DataFrame panda; possiamo costruire questa procedura come segue:
import pandas as pd
import xml.etree.ElementTree as et
xtree = et.parse("students.xml")
xroot = xtree.getroot()
df_cols = ["name", "email", "grade", "age"]
rows = []
for node in xroot:
s_name = node.attrib.get("name")
s_mail = node.find("email").text if node is not None else None
s_grade = node.find("grade").text if node is not None else None
s_age = node.find("age").text if node is not None else None
rows.append({"name": s_name, "email": s_mail,
"grade": s_grade, "age": s_age})
out_df = pd.DataFrame(rows, columns = df_cols)
Lo svantaggio di questo approccio รจ che devi conoscere in anticipo la struttura del file XML e devi codificare i nomi delle colonne di conseguenza.
Possiamo provare a convertire questo codice in una funzione piรน utile e versatile, senza dover codificare alcun valore:
import pandas as pd
import xml.etree.ElementTree as et
def parse_XML (xml_file, df_cols):
"" "Analizza il file XML di input e memorizza il risultato in un
DataFrame panda con le colonne indicate.
Il primo elemento di df_cols dovrebbe essere la
variabile identificatore , che รจ un attributo di ogni elemento del nodo nei
dati XML; altre caratteristiche verranno analizzate dal contenuto
di testo di ogni sottoelemento.
"" "
xtree = et.parse(xml_file)
xroot = xtree.getroot()
rows = []
for node in xroot:
res = []
res.append(node.attrib.get(df_cols[0]))
for el in df_cols[1:]:
if node is not None and node.find(el) is not None:
res.append(node.find(el).text)
else:
res.append(None)
rows.append({df_cols[i]: res[i]
for i, _ in enumerate(df_cols)})
out_df = pd.DataFrame(rows, columns=df_cols)
return out_df
Un pezzo di codice interessante รจ la comprensione dei dettami in:
{df_cols [i]: res [i] for i, _ in enumerate (df_cols)}
dove viene creato un dizionario nel nome della colonna del modulo: il valore del nodo e aggiunto all'elenco delle righe. Questi verranno infine utilizzati per creare il dataframe completo.
Utilizziamo ora la funzione
parse_XML("students.xml", ["name", "email", "grade", "age"])
Questa รจ un'implementazione piรน efficiente della funzione di analisi XML, sebbene abbiamo ancora bisogno di conoscere la struttura di base del documento XML di input che vogliamo analizzare.
Grazie per aver fatto qui la tua domanda, fammi sapere se funziona.