Zanurkuj w Pythonie/Dostęp do atrybutów elementów

Dostęp do atrybutów elementów

edytuj

Elementy XML-a mogą mieć jeden lub wiele atrybutów i jest niewiarygodnie łatwo do nich dotrzeć, gdy dokument XML został już sparsowany.

W tym podrozdziale będziemy korzystać z pliku binary.xml, który już widzieliśmy w poprzednim podrozdziale.

Przykład. Dostęp do atrybutów elementów
>>> xmldoc = minidom.parse('binary.xml')
>>> reflist = xmldoc.getElementsByTagName('ref')
>>> bitref = reflist[0]
>>> print bitref.toxml()
<ref id="bit">
  <p>0</p>
  <p>1</p>
</ref>
>>> bitref.attributes          #(1)
<xml.dom.minidom.NamedNodeMap instance at 0x81e0c9c>
>>> bitref.attributes.keys()   #(2) (3)
[u'id']
>>> bitref.attributes.values() #(4)
[<xml.dom.minidom.Attr instance at 0x81d5044>]
>>> bitref.attributes["id"]    #(5)
<xml.dom.minidom.Attr instance at 0x81d5044>
  1. Każdy obiekt Element ma atrybut o nazwie attributes, który jest obiektem klasy NamedNodeMap. Brzmi groźnie, ale takie nie jest, ponieważ obiekt NamedNodeMap jest obiektem działającym jak słownik, a więc już wiemy, jak go używać.
  2. Traktując obiekt NamedNodeMap jak słownik, możemy pobrać listę nazw atrybutów tego elementu używając attributes.keys(). Ten element ma tylko jeden atrybut: 'id'.
  3. Nazwy atrybutów, jak każdy inny tekst w dokumencie XML, są zapisane w postaci unikodu.
  4. Znowu traktując NamedNodeMap jak słownik, możemy pobrać listę wartości atrybutów używając attributes.values(). Wartości same w sobie także są obiektami typu Attr. Jak wydobyć użyteczne informacje z tego obiektu zobaczymy w następnym przykładzie.
  5. Nadal traktując NamedNodeMap jak słownik, możemy dotrzeć do poszczególnych atrybutów poprzez ich nazwy, używając normalnej składni dla słowników. (Szczególnie uważni czytelnicy już wiedzą jak klasa NamedNodeMap realizuje ten fajny trik: poprzez definicję metody specjalnej o nazwie __getitem__. Inni czytelnicy mogą pocieszyć się faktem, iż nie muszą rozumieć jak to działa, aby używać tego efektywnie.)
Przykład. Dostęp do poszczególnych atrybutów
>>> a = bitref.attributes["id"]
>>> a
<xml.dom.minidom.Attr instance at 0x81d5044>
>>> a.name  #(1)
u'id'
>>> a.value #(2)
u'bit'
  1. Obiekt Attr w całości reprezentuje pojedynczy atrybut XML-a pojedynczego elementu XML-a. Nazwa atrybutu (ta sama, której użyliśmy do znalezienia tego obiektu w bitref.attributes pseudo-słownikowym obiekcie NamedNodeMap) znajduje się w a.name.
  2. Właściwa wartość tekstowa tego atrybutu XML-a znajduje się w a.value.