Foros del Web » Programando para Internet » Python »

Duda con un ejercicio pasar datos xml en diccionario

Estas en el tema de Duda con un ejercicio pasar datos xml en diccionario en el foro de Python en Foros del Web. Me plantean este ejercio y me gustaria saber si voy bien encaminado: Diseñad e implementáis una función que, dado un nombre de fichero XML que ...
  #1 (permalink)  
Antiguo 11/01/2011, 05:17
 
Fecha de Ingreso: enero-2011
Ubicación: Barcelona
Mensajes: 9
Antigüedad: 13 años, 2 meses
Puntos: 0
Pregunta Duda con un ejercicio pasar datos xml en diccionario

Me plantean este ejercio y me gustaria saber si voy bien encaminado:
Diseñad e implementáis una función que, dado un nombre de fichero XML que contenga los datos de los o modelos de piezas en el formato mencionado anteriormente, lo lea y devuelva una estructura tipo "diccionario con listas" para almacenar las piezas, llenada con la información recopilada o el fichero. En caso de que la estructura del fichero XML no sea correcta tenéis que proceder de la siguiente manera:
• En caso de que lo etiqueta o lo etiqueta o que alguna de las etiquetas que conforman la información de un modelo de pieza (<peca>, </peca>, <nom>, </nom>, <mida>, </mida>, <pes> o </pes>) no aparezcan o estén mal escritas, tenéis que parar la función y, en vez de devolver la estructura, tenéis que devolver algún valor que indique la imposibilidad de leer el fichero.

Aki os pongo lo que he echo:
Código python:
Ver original
  1. import string
  2.  
  3. def llegir(arxiu):
  4.  
  5.     obre_arxiu=open(arxiu,"r")
  6.     llista=obre_arxiu.readlines()
  7.     print llista
  8.        
  9.     if llista[0]=="<peces>\n" and llista[-2]=="</peces>\n":
  10.         dicc={}
  11.         llista_peca=[]
  12.         for linia in llista:
  13.             if "<nom>" and "</nom>\n" in linia:
  14.                 peca=linia[5:-7]
  15.                 peca=string.strip(peca)
  16.      
  17.             elif "<mida>" and "</mida>\n" in linia:
  18.                 mida=linia[6:-8]
  19.                 mida=string.strip(mida)
  20.            
  21.             elif "<pes>" and "</pes>\n" in linia:
  22.                 pes=linia[5:-7]
  23.                 pes=string.strip(pes)
  24.                 dicc[peca]=mida,pes
  25.        
  26.            
  27.             else:
  28.                 pass
  29.        
  30.                                  
  31.     else:
  32.         pass
  33.  
  34.     return dicc

Última edición por AlvaroG; 11/01/2011 a las 05:34
  #2 (permalink)  
Antiguo 11/01/2011, 05:35
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda con un ejercicio pasar datos xml en diccionario

Pues sí, parece una buena forma de atacar el problema. No tengo ningún comentario específico para hacerte.


Saludos.
  #3 (permalink)  
Antiguo 11/01/2011, 05:49
 
Fecha de Ingreso: enero-2011
Ubicación: Barcelona
Mensajes: 9
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Duda con un ejercicio pasar datos xml en diccionario

El problema que tengo es que con la estructura que tengo montada solo me sirve con el ejemplo 1, pero no me acaba de funcionar si me dan una linea de codigo .xml como el ejemplo 2 nose si me podrian guiar de como podria hacerlo?
Ejemplo1:
Código PHP:
<peces>
  <
peca>
     <
nom>crani</nom>
     <
mida>2</mida>
     <
pes>5</pes>
  </
peca>
  <
peca>
     <
nom>sensor optic</nom>
     <
mida>0.5</mida>
     <
pes>0.2</pes>
  </
peca>
</
peces
Ejemplo2:
Código PHP:
<peces><peca><nom>crani</nom><mida>2</mida><pes>5</pes></peca><peca><nom>sensor optic</nom><mida>0.5</mida><pes>0.2</pes></peca></peces
  #4 (permalink)  
Antiguo 11/01/2011, 06:14
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda con un ejercicio pasar datos xml en diccionario

Sip, eso es lógico dado que en tu función te estás basando en las líneas del archivo.

Tendrás que usar las funciones de cadenas para ir leyendo las diferentes etiquetas. Quizás usando split para separar por "<" o ">", o buscar partes específicas con find


Saludos.
  #5 (permalink)  
Antiguo 11/01/2011, 08:55
 
Fecha de Ingreso: enero-2011
Ubicación: Barcelona
Mensajes: 9
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Duda con un ejercicio pasar datos xml en diccionario

vale gracias me pondré en ello si hay alguna duda ya la haré saber
  #6 (permalink)  
Antiguo 11/01/2011, 13:51
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Duda con un ejercicio pasar datos xml en diccionario

Hay maneras de atacar este problema

En etapa laboral: Usa un parser BeautifulSoup o lxml
Etapa de aprendizaje personal: Usa expresiones regulares (No intentes esto para producción)
Etapa de escuela: Usa los métodos de cadenas.
  #7 (permalink)  
Antiguo 12/01/2011, 07:03
 
Fecha de Ingreso: enero-2011
Ubicación: Barcelona
Mensajes: 9
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Duda con un ejercicio pasar datos xml en diccionario

Despues de unas cuantas horas el resultado a sido este. Nose que les parece si se podria retocar algo?

Código PHP:
# -*- encoding: utf-8 -*-

from xml import*

def peces(arxiu_xml):
        
"""
        Devuelve un diccionario añadiendo el nombre de la pieza leída en el archivo
 xml como primer elemento del diccionario y como valor una tupla con la medida
 como primer elemento y el peso como segundo elemento de la pieza.

        >>> peces("
arxiu_peces.xml")
        {"
crani":("2","5"), "sensor optic":("0.5","0.2")}
    
        """

        
bd= {}
        
arxiuopen(arxiu_xml,"r")
        
textarxiu.read()
        
amenja_seguent_bloc(text"peces")
        
ba[0]
        
sb.strip()
        
cs.find(">")
        
yc+1
        etiqueta
s[0:y]
    
        while 
s.find(etiqueta)!=-1:
            
d=menja_seguent_bloc(s,etiqueta[1:c])
            
f=d[0]
            
j=f.strip()
            
g=menja_seguent_bloc(j,"nom")
            
h=menja_seguent_bloc(g[1],"mida")
            
i=menja_seguent_bloc(h[1],"pes")
            
paraula_claug[0]
            
mida=h[0]
            
pes=i[0]
            
bd[paraula_clau]=(mida,pes)
            
t=d[1]
            
s=t.strip()
  
        return 
bd
        arxiu
.close()


def models_de_cap(arxiu_xml):
        
"""
        Devuelve un diccionario añadiendo el nombre del modelo de ningún leído en
 el archivo xml como primer elemento del diccionario y como valor una tupla con el
 nombre de las piezas necesarias para fabricarlo.

        >>> models_de_cap("
arxiu.xml")
        {"
cap de visió":("crani","sensor optic","sensor optic"), "cap de audició":("crani","sensor auditiu","sensor auditiu")}

        """

       
bd={}
       
arxiu=open(arxiu_xml,"r")
        
text=arxiu.read()
        
a=menja_seguent_bloc(text,"caps")
        
b=a[0]

        
s=b.strip()

        
c=s.find(">")

        
y=c+1
        etiqueta
s[0:y]

        while 
s.find(etiqueta) !=-1:
            
d=menja_seguent_bloc(s,etiqueta[1:c])

            
f=d[0]

            
x=f.strip()
            
g=menja_seguent_bloc(x,"nom")
            
h=menja_seguent_bloc(g[1],"peces")
            
i=h[0]
            
j=i.strip()
            
k=j.find(">")
            
l=k+1
            etiqueta2
j[0:l]
            
bd[g[0]]=()
            
llista= list(bd[g[0]])
            while 
j.find(etiqueta2)!=-1:
                    
m=menja_seguent_bloc(jetiqueta2[1:k])
                    
nom_pesa=m[0]            
            
                    
llista.append(nom_pesa)
                                
                    
o=m[1]
                    
j=o.strip()
        
        
            
llistatuple(llista)

            
bd[g[0]]= llista
       
        
            p
d[1]
            
sp.strip()
        

        return 
bd
        arxiu
.close()
        


def nom_magatzem(arxiu_xml):
        
    
"""
        Devuelve un diccionario añadiendo el nombre del almacén como palabra
 clave y el valor se una tupla con la capcidad como primer elemento, el peso
 máximo como segundo elemento y el tercer elemento se una nueva tupla con el
 contenido que será otras tuplas, cada una con el nombre de la pieza y la cantidad.

        >>>nom_magatzem("
arxiu_magatzem.xml")
        {"
Magatzem 1":("20","100",{"crani": "2","sensor optic": "8","sensort auditiu": "4"})}

        """

    
bd= {}
    
dic={}
    
arxiuopen(arxiu_xml'r')
    
textarxiu.read()
    
atext.find('>')
    
ba+1
    etiqueta
text[0:b]
    while 
text.find(etiqueta) != -1:
        
dmenja_seguent_bloc(textetiqueta[1:a])
        
ed[0]
        
fmenja_seguent_bloc(e'nom')
        
nom_magatzemf[0]
        
gmenja_seguent_bloc(f[1], 'capacitat')
        
capacitatg[0]
        
hmenja_seguent_bloc(g[1], 'pesmaxim')
        
pesmaximh[0]
        
ih[1]
        
ji.find('>')
        
kj+1
        etiqueta2
i[0:k]
        while 
i.find(etiqueta2)!=-1:
            
l=menja_seguent_bloc(ietiqueta2[1:j])
            
ml[0]
            
nmenja_seguent_bloc(m'peca')
            
nom_pesan[0]
            
omenja_seguent_bloc(n[1], 'quantitat')
            
quantitato[0]
            
dic[nom_pesa]= quantitat
            l
=menja_seguent_bloc(ietiqueta2[1:j])
            
i=l[1

        
dmenja_seguent_bloc(textetiqueta[1:a])
        
textd[1]
        
bd[nom_magatzem]= (capacitatpesmaximdic)
        return 
bd
    arxiu
.close()




def recull_fitxers(arxiu_capsarxiu_pecesarxiu_magatzem):
       
"""
        Devuelve una tupla donde el primer elemento se un diccionario que cuento la
 estructura de los modelos de piezas, el segundo elemento se un diccionario que
 cuento la estructura de los modelos de ninguno y el tercer elemento se un
 diccionario que cuento la estructura de los modelos de almacén.
        >>>recull_fitxers(arxiu_caps, arxiu_peces, arxiu_magatzem)
        ({'cap de visio':('crani', 'sensor optic', 'sensor optic'), 'cap de audicio':('crani', 'sensor auditiu', 'sensor auditiu')}, {'crani':('2','5'),'sensor optic':('0.5','0.2')},{'magatzem 1':('20','100',(('sensor optic','8'),('sensor auditiu','4')))})
        """

        
apeces(arxiu_peces)
        
bmodels_de_cap(arxiu_caps)
        
cnom_magatzem(arxiu_magatzem)
        return 
ab

Etiquetas: diccionario, pasar, xml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:38.