|
|||||
Menu
Distributions (131)
Software (10844)
|
Programujeme s XML (2.) - DOM v rychlíkuOd minula již umíme načíst, uložit a vytvořit nový dokument, dnes se podíváme na nejjednušší manipulace s ním.
Zjišťujeme atributyPokud máme nějakou instanci třídy element, můžeme prostřednictvím metody getAttribute() (v případě DOM2 i pomocí její varianty pracující se jmenými prostory) zjistit hodnotu některého z jeho atributů. Například pro kořenový element (v pythonu, ale ono je to ve všech třech našich jazycích vlastně stejné, pouze musíme navíc používat přetypování):
>>> doc Jenom maáa poznamka - zápis u'něco' v pythonu značí řetězec znaku v kódování Unicode. Hledáme elementy podle názvu
Pomocí metody getElementsByTagName() (připadně getElementsByTagNameNS()) můžeme vyhledat všechny subelementy daného názvu (a případně jmenného prostoru). Výsledkem je instance třídy
>>> nodelist = doc.getElementsByTagName("textovy-element")
>>> doc.documentElement. getElementsByTagName('vnorene-elementy').item(0). getElementsByTagName('vnitrni-element').item(1). getAttribute('poradi')
Jenom bych dodal, že metoda item() třídy Textové uzlyProtože dokumenty neobshují jen elementy a atributy, ale i text, bylo by záhodno, umět s tímto textem manipulovat. Pokud nepotřebujeme používat v DTD definované entity, můžeme použít jednoduchou a rychlou metodu: Zavoláme metodu normalize(), jež spojí všechny sousedící textové uzly. Pokud si můžeme být jisti tím, že kde očekáváme text, je opravdu pouze text a případně standardní entity (>, <, & a číselné unicode entity), dostaneme všude, kde má být text, jeden textový uzel. Ten poté můžeme snadno načíst:
>>> doc.normalize() Tento přístup je často dostačující, ale občas potřebujeme zpracovat i dokumenty se složitější strukturou. Potom musíme iterovat přes jednotlivé dceřiné uzly a textový řetězec si zrekonstruovat sami. Není to zrovna přehledné, ale kdo něco podobného potřebuje, jistě sám vymyslí jak na to, jediným problemém je, že musíme poznat, které uzly nás zajímají (text, CDATA, případně entity) a pak správně pospojovat jejich obsah. Procházíme elementyJistě jste si všimli, že máme několik možností, jak procházet obsah elementů. Můžeme používat atribut childNodes obalujicího uzlu a postupně dereferencovat další uzly:
>>> element.childNodes.item(0) Nebo můžeme postupně používat atribudy nextSibling a previousSibling a přímo procházet uzly, tento přístup by měl být dle mého názoru o něco málo rychlejší a funkčně je shodný s předchozím.
>>> element = element.firstChild
Takto můžeme postupně projít všechny uzly, pokud nás ovšem zajímají pouze elementy a navíc pouze elementy daného názvu, můžeme použít výše zmíněnou metodu getElementsByTagName() třídy
>>> nodelist = element.getElementsByTagName('vnitrni-element')
Jako specialita v Pythonu existuje třída Všechny dnešní ukázky jsou psané v Pythonu, hodilo by se tedy uvést několik poznámek:
Příště se podíváme na to jak v dokumentu vytvářet nové uzly, ať již elementy, text nebo třeba komentáře. A asi se porozhlédnu na internetu po nějakém méně vyumělkovaném ukázkovém dokumentu. |