2012-07-25 7 views
8

Chcę iterację wszystkich atrybutów węzła dom i uzyskać nazwę i wartośćPython minidom - jak iterację atrybutów, i uzyskać ich nazwę i wartość

Próbowałem coś takiego (docs nie były bardzo gadatliwy na to, więc domyśliłem się trochę):

for attr in element.attributes: 
    attrName = attr.name 
    attrValue = attr.value 
  1. dla pętli nawet nie zaczynają
  2. jak uzyskać nazwę i wartość atrybutu raz mam pętlę do pracy?

Loop Błąd:

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 

Jestem nowy w Pythonie, być delikatny proszę

+1

Czy jesteś zmuszony przez okoliczności do korzystania minidom? 'Xml.etree.ElementTree' jest wygodniejszy. – pepr

+0

Dzięki, zakładam, że nie znalazłem żadnych zasobów, ponieważ minidom nie jest już używany ... spróbuję ... –

Odpowiedz

13

jest krótki i efektywny (i pythonic?) sposób to zrobić łatwo

#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) 

Jeśli to, co staramy się osiągnąć to, aby przenieść te niewygodne atrybut NamedNodeMap do bardziej użytecznego słownika można kontynuować tak jak Wynika

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

zobaczyć http://docs.python.org/2/library/stdtypes.html#mapping-types-dict a dokładniej przykład:

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

atrybuty zwraca NamedNodeMap który zachowuje się podobnie jak słownik, ale w rzeczywistości nie jest słownik. Zamiast tego spróbuj przeliczyć na iteritems() z attributes. (Należy pamiętać, że zapętlenie nad regularnym dict pętle nad klawiszami i tak, więc kod nie będzie działać zgodnie z oczekiwaniami w każdym przypadku).

2

Ok, po spojrzeniu na this (somewhat minimal) documentation, domyśliłem się do sukcesu następujące rozwiązanie

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