2012-07-25 21 views
8

Quiero iterar a través de todos los atributos de un nodo DOM y obtener el nombre y el valorPython minidom - forma de repetición de atributos, y obtener su nombre y el valor

Probé algo como esto (docs no eran muy prolijo en esto, así que supuse un poco):

for attr in element.attributes: 
    attrName = attr.name 
    attrValue = attr.value 
  1. el bucle ni siquiera empezar
  2. ¿cómo puedo obtener el nombre y el valor del atributo una vez que consiga el lazo para trabajar?

error Loop:

for attr in element.attributes: 
    File "C:\Python32\lib\xml\dom\minidom.py", line 553, in __getitem__ 
    return self._attrs[attname_or_tuple] 
KeyError: 0 

Soy nuevo en Python, por favor ser suave

+1

¿Está obligado por las circunstancias a utilizar minidom? El 'xml.etree.ElementTree' es más cómodo. – pepr

+0

Gracias, supongo que no encontré ningún recurso ya que minidom ya no se usa ... lo intentaré ... –

Respuesta

13

Hay un camino corto y eficiente (y Pythonic?) para hacerlo fácilmente

#since items() is a tUple list, you can go as follows : 
for attrName, attrValue in element.attributes.items(): 
    #do whatever you'd like 
    print "attribute %s = %s" % (attrName, attrValue) 

Si lo que estamos tratando de lograr es transferir los atributos inconveniente NamedNodeMap a un diccionario más utilizable se puede proceder como sigue

#remember items() is a tUple list : 
myDict = dict(element.attributes.items()) 

ver http://docs.python.org/2/library/stdtypes.html#mapping-types-dict y más precisamente ejemplo:

d = dict([('two', 2), ('one', 1), ('three', 3)]) 
1

atributos devuelve un NamedNodeMap la que se comporta como un diccionario, pero en realidad no es un diccionario. Intente pasar por encima de iteritems() de attributes en su lugar. (Tenga en cuenta que más de un bucle dict regular de bucles de las llaves de todos modos, por lo que su código no funcionaría como era de esperar en cualquier caso.)

2

, después de mirar this (somewhat minimal) documentation, supuse para el éxito de la siguiente solución Ok

#attr is a touple apparently, and items() is a list 
for attr in element.attributes.items(): 
    attrName = attr[0] 
    attrValue = attr[1] 
Cuestiones relacionadas