XML a E4X
Obsah
Pokud nemáte úplně jasno, co je vlastně XML, nahlédněte třeba do Wikipedie. Tato stránka se věnuje už jen objektům v ActionScriptu a pochopitelně rozhraní E4X.
Objekt XML
XML dokument reprezentuje objekt XML. V AS3 má k dispozici i přímý literál.
var config:XML = <config> <crypto> <cookies type="aes">ae1864f69cc9874</cookies> <uri type="aes">15eff698acdbc98</uri> </crypto> <access> <deny from="95.168.205.132" expire="0" die="1">SEO servis</deny> <deny from="128.30.52.70" expire="0" die="1">W3C Validator</deny> </access> </config>;
Jak vidíte, XML se píše přímo. Všimněte si, že kořenový element není ohraničen uvozovkami. V přímé definici se neuvádí XML deklarace.
Statické vlastnosti objektu XML
XML obsahuje sadu statických vlastností, kterými lze ovlivnit chování XML parseru. Nejčastěji nejspíše použijete ignoreWhitespace, kdy pak při procházení stromem dokumentu nebudou brány v potaz bílé znaky jako textové nody.
XML.ignoreWhitespace = true;
Pro zbytek nahlédněte do dokumentace.
Kolekce XMLList
Ze specifikace plyne, že XML dokument má vždy právě jeden kmenový element. To může být poněkud svazující, protože často potřebujeme pracovat se skupinou elementů. Nabízí se použití pole XML objektů, což kolekce XMLList v podstatě je. Narozdíl od obyčejného pole, tedy Array, ovšem XMLList obsahuje iterátory a metody přímo pro práci s XML daty a umožňuje tak pracovat s kolekcí, jakoby to byl jeden XML dokument.
Vzhledem k tomu, že E4X operátory jsou pro kolekci i objekt XML shodné, a taktéž iterátory kolekce mají shodná jména s metodami objektu, je možné rozdíl v duchu téměř ignorovat.
Syntaxe E4X
E4X má zjedodušit práci s daty objektu XML a kolekce XMLList. Ta je samozřejmě možná i prostřednictvím běžných metod, což je ale ovšem elegantní asi jako hromada kamení - u delších výrazů obzvlášť.
Přímý potomek (child, children a elements)
Pro přímé potomky se používá operátor tečka. Výsledkem je kolekce XMLList.
config.access.deny[1].text(); // W3C Validator
Můžeme taky chtít všechny potomky.
config.crypto.*.text(); // ae1864f69cc9874, 15eff698acdbc98
Totéž pak dělají metody child a children respektive elements, který vždy ignoruje textové nody, komentáře a procesní instrukce.
Nepřímý potomek (descendants)
Dvě tečky značí nepřímého potomka (tím je myšlen třeba pravnuk).
config..deny.text(); // SEO servis, W3C Validator
Pamatujte, že jsou vybráni všichni potomci - z libovolné hloubky. Ekvivalentem je metoda descendants. Hvězdička vybere veškeré potomky.
Atribut (attribute a attributes)
K atributům elementu se přistupuje operátorem @.
config.access.deny.@from; // 95.168.205.132, 128.30.52.70 config.access.deny[0].@*; // 95.168.205.132, 0, 1 config.access.deny[0].@*[2]; // 1
Ekvivalentní jsou pak opět metody attribute a attributes.
Často jsou atributy využity pro selekci elementů. I v takovém případě umí E4X posloužit.
config.access.deny.(@expire == 0).text(); // SEO servis, W3C Validator
Zde jsou vybrány jen elementy s atributem expire rovným nule.
Úpravy XML dokumentu
Obrovskou pomocí je schopnost E4X nejen číst, ale také zapisovat do stromu dokumentu. Vše opět zcela intuitivně známými operátory.
config.access.deny = <deny from="127.0.0.1">Localhost</deny> + config.access.deny; config.crypto.cookies.@type = '3des'; delete config.crypto.uri;
Zde jsme například přidali další element před první element deny, změnili atribut type a odstranili jeden element.
Tyto a jiné operace pak zajišťují také metody appendChild, insertChildAfter, insertChildBefore, prependChild, setChildren, setName a další. Podrobněji v dokumentaci objektu XML.
Jmenné prostory XML
Mějme následující XML dokument.
var news:XML = <news xmlns:plain = "http://flash.jakpsatweb.cz/plain"> <item> <title>Lorem ipsum</title> <content><![CDATA[<p>Lorem ipsum dolor<br>sit amet.</p>]]></content> <plain:content>Lorem ipsum dolor sit amet.</plain:content> </item> </news>;
Jak vidíte, je zde definován jmenný prostor plain, protože potřebujeme vytvořit plaintextovou variantu elementu content a nejsme prasata abychom pro stejnou věc vymýšleli jiný identifikátor.
Výběr prvního elementu content proběhne celkem očekávaným způsobem.
news.item.content.text(); // <p>Lorem ipsum dolor<br>sit amet.</p>
Jmenné prostory ActionScriptu a E4X jsou provázány
Aby bylo možné přistoupit k XML elementu s jiným jmenným prostorem, musí být tento prostor definován i v AS.
namespace plain = "http://flash.jakpsatweb.cz/plain"; news.item.plain::content.text(); // Lorem ipsum dolor sit amet.
Hodnota jmenného prostoru je libovolná. Typicky se používá (i neexistující) URL adresa. V AS a XML se ale pochopitelně musí shodovat.
Hvězdičkou jde vybrat element ze všech jmenných prostorů.
news.item.*::content.text(); // <p>Lorem ipsum dolor<br>sit amet.</p>, // Lorem ipsum dolor sit amet.
E4X také bude respektovat direktivu use namespace.
use namespace plain; news.item.content.text(); // <p>Lorem ipsum dolor<br>sit amet.</p>, // Lorem ipsum dolor sit amet.
Výchozí jmenný prostor XML
Pozor na výchozí jmenný prostor XML. Je to oblíbená kratochvíle XHTML, kdy pak má neznalý programátor tendenci rozkousat kabely od periférií počítače.
var html:XML = <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <body>Lorem Ipsum</body> </html>;
Zde je pro všechny elementy dokumentu hledán jmenný prostor s hodnotou http://www.w3.org/1999/xhtml.
namespace xhtml = 'http://www.w3.org/1999/xhtml'; use namespace xhtml; html.body.text(); // Lorem Ispum
Nezapomínejte na přetypování
Většina metod a E4X operátorů vrací objekt XML nebo kolekci XMLList. Týká se to například i hodnot, u kterých byste to neočekávali - třeba hodnot atributů.
Nebývá v tom problém, protože je objekt většinou při použití sám přetypován na String. Říkám většinou, protože někdy ne. Hlavně u složitějších komponent je třeba na správné přetypování dávat pozor a případně použít metodu toString.
Pozor také na oblíbený omyl s metodou text. Ta vrací také XMLList, konkrétně všechny textové nody elementu.
Ohlédnutí za objektem XML v AS2.0
AS2.0 obsahuje také objekt XML. Je to jeden z příkladů zpětně i dopředně nekompatibilního vývoje jazyka.
Starý objekt XML byl tak trochu prasopes, který kromě parsování XML dokumentů obstarával i jejich načítání. Je stále k dispozici pod novým názvem flash.xml.XMLDocument, nyní už bez komunikačních schopností.
Není žádný důvod jej pro nové programy používat.