Forum >> Programmazione Python >> Files e Directory >> Estrarre informazioni da XML

Pagina: 1

Salve a tutti amici del forum ! Gestisco delle API con il modulo requests le quali devono ritornarmi delle informazioni in XML come queste che vi allego in esempio:




<?xml version="1.0"?>

<ocs>

<meta>

<status>failure</status>

<statuscode>403</statuscode>

<message>Path is already shared with this user</message>

<totalitems></totalitems>

<itemsperpage></itemsperpage>

</meta>

<data/>

</ocs>




ora io vorrei estrarre ad esempio il valore contenuto fra questi due campi <statuscode> </statuscode>

come devo fare ? non riesco a trovare una guida su internet che mi faccia un esempio concreto su questo.

Spero possiate darmi una mano :)

buona giornata




Ciao caro, ad occhio c'è un errore in quell'XML, col tag <data>. Ma a parte questo, che libreria usi per accedere all'XML? Ce ne sono diverse e con funzionamenti leggermente differenti.

Ipotizziamo di utilizzare xml.etree.ElementTree, partiamo dal principio del tuo file.
>>> import xml.etree.ElementTree as ET
>>> xml_root = """<?xml version="1.0"?>
<ocs>
    <data>
     <meta>
        <status>failure</status>
        <statuscode>403</statuscode>
        <message>Path is already shared with this user</message>
        <totalitems></totalitems>
        <itemsperpage></itemsperpage>
    </meta>
</data>
</ocs>
"""
Ora potrebbe essere un file, nel nostro esempio si tratta di un xml all'interno del codice. La differenza sarebbe quella di richiamare il file con ET.parse('nome del file').getroot() e sarebbe uguale, nel nostro caso useremo ET.fromstring() perchè, come detto, l'xml è dentro il codice stesso.
>>> x = ET.fromstring(xml_root)
>>> print(x.tag) #Che succede se stampiamo x?
ocs

>>> """Oh bene, quindi siamo arrivati al primo elemento del nostro semplice xml, 
...    ma non fermiamoci, vogliamo arrivare più in profondità."""

>>> for i in x:
...     print(i.tag)
data

>>> for i in x:
...     for ii in i:
...         print(ii.tag)
meta

>>> for i in x:
...    for ii in i:
...        for iii in ii:
...            print(iii.tag)
status
statuscode
message
totalitems
itemsperpage



Adesso tutto è chiaro (ma brutto), credo che tu abbia capito come muoverti all'interno del tuo xml, anche se possiamo usare qualche "scorciatoia", chiamiamola così se i permetti.

Se scriviamo:

>>> print(x[0][0][1].tag) #che cosa credi che stampi?
statuscode

>>> print(x[0][0][1].text)
403


Ci siamo, siamo arrivati dove volevamo, se non è abbastanza, possiamo farci aiutare da find().
>>> print(x[0][0].find('statuscode').text
403


Questa è solo la punta dell'iceberg, puoi davvero usare altri mille modi di cercare informazioni in un xml, alcune molto più performanti di quelle che ti ho mostrato. Esistono anche altre librerie, mi viene in mente lxml ad esempio, insomma devi solo fare alcune prove e trovare quello che ti piace di più.

Cya


Grazie mille Cya ! Sei sempre gentilissimo ed esaustivo ! :batti5:
Grazie mille Cya ! Sei sempre gentilissimo ed esaustivo ! :batti5:
Grazie è un piacere, comunque cya è un saluto non il mio nome. ;)

E quindi... CYA.

Sorry.. credevo fosse un nickname :D
salve a tutti amici, riapro questo post perché ho difficolta nell'estrarre da questo report xml i campi contenuti nel tag <groups> </groups>.
Spero in un vostro aiuto.

grazie e buona domenica




<?xml version="1.0"?>
<ocs>
 <meta>
  <status>ok</status>
  <statuscode>100</statuscode>
  <message>OK</message>
  <totalitems></totalitems>
  <itemsperpage></itemsperpage>
 </meta>
 <data>
  <enabled>1</enabled>
  <storageLocation>/web/htdocs/www.mysite.it/home/nextcloud/data/USER_NAME</storageLocation>
  <id>USER_NAME</id>
  <lastLogin>1552754625000</lastLogin>
  <backend>Database</backend>
  <subadmin/>
  <quota>
   <free>0</free>
   <used>0</used>
   <total>0</total>
   <relative>0</relative>
   <quota>0</quota>
  </quota>
  <email/>
  <displayname>USER_NAME</displayname>
  <phone></phone>
  <address></address>
  <website></website>
  <twitter></twitter>
  <groups>
   <element>G-0000</element>
   <element>G-0200</element>
  </groups>
  <language>it</language>
  <locale></locale>
  <backendCapabilities>
   <setDisplayName>1</setDisplayName>
   <setPassword>1</setPassword>
  </backendCapabilities>
 </data>
</ocs>



--- Ultima modifica di dandi98 in data 2019-03-17 13:44:19 ---
salve a tutti amici, riapro questo post perché ho difficolta nell'estrarre da questo report xml i campi contenuti nel tag <groups> </groups>.
Ciao caro, mostra il codice ed indica dove ti perdi, così ne discutiamo insieme.

ciao Daniele, in realtà sono riuscito a listare il codice html in questo modo:



d = {}

res = session.get(url, headers=headers) #contenuto html estratto dal web




x = ET.fromstring(res.text)







tag = [i.tag for i in x.iter()]

text = [i.text for i in x.iter()]




for index, v in enumerate(tag):

if v in d:

dv.extend([textindex])

else:

dv = [textindex]
------

Ed estraggo i valori che mi servono richiamando la chiave d['elements']




però sono sicuro che esista un modo più elegante del mio per estrarre gli elementi del tag groups :D
però sono sicuro che esista un modo più elegante del mio per estrarre gli elementi del tag groups :D
Prova con un semplice:
>>> x = ET.fromstring(xml_file)
>>> [i.text for i in x[1].find('groups')]
['G-0000', 'G-0200']

Cya
grazie mille come sempre :).
Buona giornata


Pagina: 1



Esegui il login per scrivere una risposta.