Topic: Estrarre informazioni da file xml  (Letto 3152 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline mgamberi

  • python unicellularis
  • *
  • Post: 32
  • Punti reputazione: 0
    • Mostra profilo
Estrarre informazioni da file xml
« il: Marzo 19, 2009, 10:09 »
Devo leggere un file xml fatto in questo modo:

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>AC</CDA_PRODOTTO>
<CDA_VERSIONE>01.00.01.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>DI</CDA_PRODOTTO>
<CDA_VERSIONE>03.04.00.01</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>FW</CDA_PRODOTTO>
<CDA_VERSIONE>00.09.10.06</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>RI</CDA_PRODOTTO>
<CDA_VERSIONE>02.02.05.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>RU</CDA_PRODOTTO>
<CDA_VERSIONE>01.05.01.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>SIACSA</CDA_PRODOTTO>
<CDA_VERSIONE>02.00.00.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>XM</CDA_PRODOTTO>
<CDA_VERSIONE>01.02.01.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>AC</CDA_PRODOTTO>
<CDA_VERSIONE>01.00.01.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>DI</CDA_PRODOTTO>
<CDA_VERSIONE>03.05.00.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>FW</CDA_PRODOTTO>
<CDA_VERSIONE>00.09.10.06</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>RI</CDA_PRODOTTO>
<CDA_VERSIONE>02.02.04.01</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>RU</CDA_PRODOTTO>
<CDA_VERSIONE>01.05.01.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>XM</CDA_PRODOTTO>
<CDA_VERSIONE>01.02.01.00</CDA_VERSIONE>
</ROW>

Ora il programmi dovrebbe recuperare per tutti gli ass_id = 124 il valore di CDA_PRODOTTO e di CDA_VERSIONE.

In che modo si fa?
Ho visto che serve il modulo xml.dom.
Ma una volta che ho caricato il file come le recupero le info?

Offline ~FullSyst3m~

  • python sapiens
  • *****
  • Post: 971
  • Punti reputazione: 0
    • Mostra profilo
Re: Estrarre informazioni da file xml
« Risposta #1 il: Marzo 19, 2009, 11:11 »
Devo leggere un file xml fatto in questo modo:

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>AC</CDA_PRODOTTO>
<CDA_VERSIONE>01.00.01.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>DI</CDA_PRODOTTO>
<CDA_VERSIONE>03.04.00.01</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>FW</CDA_PRODOTTO>
<CDA_VERSIONE>00.09.10.06</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>RI</CDA_PRODOTTO>
<CDA_VERSIONE>02.02.05.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>RU</CDA_PRODOTTO>
<CDA_VERSIONE>01.05.01.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>SIACSA</CDA_PRODOTTO>
<CDA_VERSIONE>02.00.00.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>XM</CDA_PRODOTTO>
<CDA_VERSIONE>01.02.01.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>AC</CDA_PRODOTTO>
<CDA_VERSIONE>01.00.01.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>DI</CDA_PRODOTTO>
<CDA_VERSIONE>03.05.00.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>FW</CDA_PRODOTTO>
<CDA_VERSIONE>00.09.10.06</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>RI</CDA_PRODOTTO>
<CDA_VERSIONE>02.02.04.01</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>RU</CDA_PRODOTTO>
<CDA_VERSIONE>01.05.01.00</CDA_VERSIONE>
</ROW>

<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>XM</CDA_PRODOTTO>
<CDA_VERSIONE>01.02.01.00</CDA_VERSIONE>
</ROW>

Ora il programmi dovrebbe recuperare per tutti gli ass_id = 124 il valore di CDA_PRODOTTO e di CDA_VERSIONE.

In che modo si fa?
Ho visto che serve il modulo xml.dom.
Ma una volta che ho caricato il file come le recupero le info?



Non mi è mai capitato di lavorare con gli XML, ma sul Dive Into Python c'è un intero capitolo dedicato alla loro manipolazione.

Offline mgamberi

  • python unicellularis
  • *
  • Post: 32
  • Punti reputazione: 0
    • Mostra profilo
Re: Estrarre informazioni da file xml
« Risposta #2 il: Marzo 19, 2009, 11:45 »
L'ho letto e lì ho visto che serve il modulo xml.dom.

Ma una volta aperto il file poi non so come recuperare le informazioni che mi servono

Offline Wolf

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 1.010
  • Punti reputazione: 0
    • Mostra profilo
Re: Estrarre informazioni da file xml
« Risposta #3 il: Marzo 19, 2009, 15:49 »
Per caso il file l'hai creato tu?

Offline mgamberi

  • python unicellularis
  • *
  • Post: 32
  • Punti reputazione: 0
    • Mostra profilo
Re: Estrarre informazioni da file xml
« Risposta #4 il: Marzo 19, 2009, 15:52 »
Da oracle con un query usando il package dbms_xmlgen.getxml

Offline Wolf

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 1.010
  • Punti reputazione: 0
    • Mostra profilo
Re: Estrarre informazioni da file xml
« Risposta #5 il: Marzo 19, 2009, 15:58 »

Offline Charles_Stain

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 1.220
  • Punti reputazione: 0
    • Mostra profilo
    • My personal website
Re: Estrarre informazioni da file xml
« Risposta #6 il: Marzo 19, 2009, 19:36 »
Non so assolutamente la bontà del modulo ma ho visto che tra i talk della pycon ce ne è uso su Amara:
http://pypi.python.org/pypi/Amara/1.1.6
Hai provato a dargli un'occhiata?

Offline Wolf

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 1.010
  • Punti reputazione: 0
    • Mostra profilo
Re: Estrarre informazioni da file xml
« Risposta #7 il: Marzo 19, 2009, 21:25 »
C'è anche lxml/BeautifulSoup ma per questo file dovrebbe bastare il minidom, sembra abbastanza semplice.

Offline imbuto

  • python neanderthalensis
  • ****
  • Post: 466
  • Punti reputazione: 2
    • Mostra profilo
Re: Estrarre informazioni da file xml
« Risposta #8 il: Marzo 19, 2009, 21:31 »
[hlpycode]#!/usr/bin/env python

rawText=r"""<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>AC</CDA_PRODOTTO>
<CDA_VERSIONE>01.00.01.00</CDA_VERSIONE>
</ROW>
-
<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>DI</CDA_PRODOTTO>
<CDA_VERSIONE>03.04.00.01</CDA_VERSIONE>
</ROW>
-
<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>FW</CDA_PRODOTTO>
<CDA_VERSIONE>00.09.10.06</CDA_VERSIONE>
</ROW>
-
<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>RI</CDA_PRODOTTO>
<CDA_VERSIONE>02.02.05.00</CDA_VERSIONE>
</ROW>
-
<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>RU</CDA_PRODOTTO>
<CDA_VERSIONE>01.05.01.00</CDA_VERSIONE>
</ROW>
-
<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>SIACSA</CDA_PRODOTTO>
<CDA_VERSIONE>02.00.00.00</CDA_VERSIONE>
</ROW>
-
<ROW>
<ASS_ID>123</ASS_ID>
<CDA_PRODOTTO>XM</CDA_PRODOTTO>
<CDA_VERSIONE>01.02.01.00</CDA_VERSIONE>
</ROW>
-
<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>AC</CDA_PRODOTTO>
<CDA_VERSIONE>01.00.01.00</CDA_VERSIONE>
</ROW>
-
<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>DI</CDA_PRODOTTO>
<CDA_VERSIONE>03.05.00.00</CDA_VERSIONE>
</ROW>
-
<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>FW</CDA_PRODOTTO>
<CDA_VERSIONE>00.09.10.06</CDA_VERSIONE>
</ROW>
-
<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>RI</CDA_PRODOTTO>
<CDA_VERSIONE>02.02.04.01</CDA_VERSIONE>
</ROW>
-
<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>RU</CDA_PRODOTTO>
<CDA_VERSIONE>01.05.01.00</CDA_VERSIONE>
</ROW>
-
<ROW>
<ASS_ID>124</ASS_ID>
<CDA_PRODOTTO>XM</CDA_PRODOTTO>
<CDA_VERSIONE>01.02.01.00</CDA_VERSIONE>
</ROW>"""

fixXmlText = '<root>%s</root>' % rawText.replace('\n-', '')

from xml.dom import minidom

xmlDoc = minidom.parseString(fixXmlText)
rootElem = xmlDoc.documentElement

for elem in rootElem.getElementsByTagName('ROW'):
        ass_id, = elem.getElementsByTagName('ASS_ID')
        if ass_id.firstChild.data == '124':
            cda_prodotto, = elem.getElementsByTagName('CDA_PRODOTTO')
            cda_versione, = elem.getElementsByTagName('CDA_VERSIONE')
            print ass_id.firstChild.data,
            print cda_prodotto.firstChild.data,
            print cda_versione.firstChild.data

[/hlpycode]
Infatti, in questo caso bastano le librerie standard.