Zanurkuj w Pythonie/Dostęp do atrybutów elementów
Wygląd
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.
Podrozdział ten może być lekko zagmatwany z powodu nakładającej się terminologii. Zarówno elementy dokumentu XML, jak i obiekty Pythona mają atrybuty. Gdy parsujemy dokument XML, otrzymujemy jakąś grupę obiektów Pythona, które reprezentują wszystkie części dokumentu XML, a niektóre z tych obiektów Pythona reprezentują atrybuty elementów XML-a. Jednak te obiekty (Python), które reprezentują atrybuty (XML), także mają atrybuty (Python), które są używane do pobierania różnych części atrybutu (XML), który ten obiekt reprezentuje. Uprzedzaliśmy, że to jest trochę zagmatwane. |
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>
- Każdy obiekt
Element
ma atrybut o nazwieattributes
, który jest obiektem klasyNamedNodeMap
. Brzmi groźnie, ale takie nie jest, ponieważ obiektNamedNodeMap
jest obiektem działającym jak słownik, a więc już wiemy, jak go używać. - Traktując obiekt
NamedNodeMap
jak słownik, możemy pobrać listę nazw atrybutów tego elementu używającattributes.keys()
. Ten element ma tylko jeden atrybut:'id'
. - Nazwy atrybutów, jak każdy inny tekst w dokumencie XML, są zapisane w postaci unikodu.
- Znowu traktując
NamedNodeMap
jak słownik, możemy pobrać listę wartości atrybutów używającattributes.values()
. Wartości same w sobie także są obiektami typuAttr
. Jak wydobyć użyteczne informacje z tego obiektu zobaczymy w następnym przykładzie. - 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 klasaNamedNodeMap
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'
- 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 wbitref.attributes
pseudo-słownikowym obiekcieNamedNodeMap
) znajduje się wa.name
. - Właściwa wartość tekstowa tego atrybutu XML-a znajduje się w
a.value
.
Podobnie jak w słowniku atrybuty elementu XML-a nie są uporządkowane. Może się zdarzyć, że w oryginalnym dokumencie XML atrybuty będą ułożone w pewnym określonym porządku i może się zdarzyć, że obiekty Attr będą również ułożone w takim samym porządku po sparsowaniu dokumentu do obiektów Pythona, ale te uporządkowania są tak naprawdę przypadkowe i nie powinny mieć żadnego specjalnego znaczenia. Zawsze powinienniśmy odwoływać się do poszczególnych atrybutów poprzez nazwę, tak jak do elementów słownika poprzez klucz.
|