Programovanie

Spracovanie XML dokumentov v Jave pomocou XPath a XSLT

Extensible Markup Language (XML) je určite jednou z najhorúcejších technológií v súčasnosti. Zatiaľ čo koncept značkovacích jazykov nie je nový, program XML sa javí ako obzvlášť atraktívny pre programátorov v prostredí Java a Internet. Rozhranie Java API pre analýzu XML (JAXP; pozri zdroje), ktoré bolo nedávno definované prostredníctvom procesu komunity Java, sľubuje poskytnutie spoločného rozhrania pre prístup k dokumentom XML. W3C definovala takzvaný Document Object Model (DOM), ktorý poskytuje štandardné rozhranie pre prácu s dokumentom XML v hierarchii stromov, zatiaľ čo Simple API for XML (SAX) umožňuje programu analyzovať dokument XML postupne na základe na modeli vybavovania udalostí. Oba tieto štandardy (SAX je de facto štandard) dopĺňajú JAXP. Spoločne tieto tri API poskytujú dostatočnú podporu pre prácu s XML dokumentmi v Jave a ich použitie popisuje veľa kníh na trhu.

Tento článok predstavuje spôsob spracovania dokumentov XML, ktorý ide nad rámec štandardných rozhraní API Java pre manipuláciu s XML. Uvidíme, že v mnohých prípadoch XPath a XSLT poskytujú jednoduchšie a elegantnejšie spôsoby riešenia problémov s aplikáciami. V niektorých jednoduchých ukážkach porovnáme čisté riešenie Java / XML s riešením, ktoré využíva XPath a / alebo XSLT.

XSLT aj XPath sú súčasťou špecifikácie jazyka XSL (Extensible Stylesheet Language) (pozri Zdroje). XSL sa skladá z troch častí: samotná špecifikácia jazyka XSL, transformácie XSL (XSLT) a jazyk XML Path Language (XPath). XSL je jazyk na transformáciu dokumentov XML; obsahuje definíciu - Formátovanie objektov -, ako je možné formátovať dokumenty XML na prezentáciu. XSLT určuje slovnú zásobu na transformáciu jedného dokumentu XML do druhého. XSLT môžete považovať za XSL mínus formátovacie objekty. Jazyk XPath adresuje konkrétne časti dokumentov XML a je určený na použitie v rámci šablóny so štýlmi XSLT.

Na účely tohto článku sa predpokladá, že ste oboznámení so základmi XML a XSLT, ako aj s rozhraniami DOM API. (Informácie a návody k týmto témam nájdete v časti Zdroje.)

Poznámka: Ukážky kódu tohto článku boli zostavené a testované pomocou analyzátora XML Apache Xerces a procesora Apache Xalan XSL (pozri Zdroje).

Problém

Mnoho článkov a článkov zaoberajúcich sa XML uvádza, že je dokonalým prostriedkom na uskutočnenie dobrej dizajnérskej praxe vo webovom programovaní: vzor Model-View-Controller (MVC), alebo, jednoduchšie povedané, oddelenie aplikačných údajov od prezentačných. . Ak sú údaje aplikácie formátované v XML, dajú sa ľahko viazať - napríklad v servlete alebo na serveri Java ServerPage - napríklad na šablóny HTML pomocou šablóny so štýlmi XSL.

XML však môže urobiť oveľa viac, než len pomôcť s oddelením modelovacích pohľadov na klientske rozhranie. V súčasnosti pozorujeme čoraz rozšírenejšie používanie komponentov (napríklad komponentov vyvinutých pomocou štandardu EJB), ktoré je možné použiť na zostavenie aplikácií, čím sa zvyšuje produktivita vývojárov. Opätovnú použiteľnosť komponentov je možné vylepšiť štandardným formátovaním údajov, s ktorými si komponenty poradí. Naozaj môžeme očakávať, že sa dočkáme čoraz viac publikovaných komponentov, ktoré používajú XML na opísanie svojich rozhraní.

Pretože údaje vo formáte XML sú jazykovo neutrálne, stanú sa použiteľnými v prípadoch, keď nie je známy klient danej aplikačnej služby, alebo keď nesmú mať na serveri žiadne závislosti. Napríklad v prostrediach B2B nemusí byť pre dve strany prijateľné závisieť od konkrétnych rozhraní objektov Java v rámci ich výmeny údajov. Tieto požiadavky riešia nové technológie, ako je protokol SOAP (Simple Object Access Protocol) (pozri Zdroje).

Všetky tieto prípady majú jednu spoločnú vlastnosť: údaje sú uložené v dokumentoch XML a je potrebné s nimi manipulovať pomocou aplikácie. Napríklad aplikácia, ktorá používa rôzne komponenty od rôznych dodávateľov, bude s najväčšou pravdepodobnosťou musieť zmeniť štruktúru (XML) údajov, aby vyhovovala potrebám aplikácie alebo dodržiavala daný štandard.

Kód napísaný pomocou vyššie spomenutých rozhraní Java API by to určite urobil. Okrem toho je k dispozícii čoraz viac nástrojov, pomocou ktorých môžete premeniť dokument XML na JavaBean a naopak, čo uľahčuje prácu s údajmi z programu Java. V mnohých prípadoch však aplikácia alebo aspoň jej časť iba spracuje jeden alebo viac dokumentov XML ako vstup a prevedie ich do iného formátu XML ako výstup. Použitie šablón štýlov v týchto prípadoch je životaschopnou alternatívou, ako uvidíme ďalej v tomto článku.

Použite XPath na vyhľadanie uzlov v dokumente XML

Ako je uvedené vyššie, jazyk XPath sa používa na vyhľadanie určitých častí dokumentu XML. Preto by ho mala používať šablóna so štýlmi XSLT, ale nič nám nebráni v jeho použití v našom programe Java, aby sme sa vyhli zdĺhavej iterácii hierarchie prvkov DOM. Skutočne môžeme nechať procesor XSLT / XPath, aby urobil prácu za nás. Poďme sa pozrieť na to, ako to funguje.

Predpokladajme, že máme aplikačný scenár, v ktorom sa používateľovi predloží zdrojový dokument XML (pravdepodobne po spracovaní šablónou štýlov). Používateľ aktualizuje údaje a z dôvodu šetrenia šírky pásma siete odosiela späť do aplikácie iba aktualizované záznamy. Aplikácia vyhľadá vo zdrojovom dokumente fragment XML, ktorý je potrebné aktualizovať, a nahradí ho novými údajmi.

Vytvoríme malú ukážku, ktorá vám pomôže pochopiť rôzne možnosti. V tomto príklade predpokladáme, že aplikácia sa zaoberá záznamami adries v adresár. Vzorka adresár dokument vyzerá takto:

  John Smith 250 18. Ave SE Rochester MN 55902 Bill Morris 1234 Center Lane NW St. Paul MN 55123 

Aplikácia (možno, aj keď nie nevyhnutne, servlet) uchováva inštanciu súboru adresár v pamäti ako DOM Dokument objekt. Keď používateľ zmení adresu, klientske rozhranie aplikácie mu odošle iba aktualizovanú element.

The prvok sa používa na jednoznačnú identifikáciu adresy; slúži ako primárny kľúč. To by nemalo veľký zmysel pre skutočnú aplikáciu, ale robíme to preto, aby sme veci zjednodušili.

Teraz musíme napísať nejaký Java kód, ktorý nám pomôže identifikovať prvok v strome zdrojov, ktorý je potrebné nahradiť aktualizovaným prvkom. The findAddress () nižšie uvedená metóda ukazuje, ako sa to dá dosiahnuť. Upozorňujeme, že aby bola vzorka krátka, vynechali sme príslušné spracovanie chýb.

public Node findAddress (názov reťazca, zdroj dokumentu) {Element root = source.getDocumentElement (); NodeList nl = root.getChildNodes (); // iterácia cez všetky uzly adresy a nájdenie toho, ktorý má správneho adresáta (int i = 0; i

Vyššie uvedený kód je možné s najväčšou pravdepodobnosťou optimalizovať, ale je zrejmé, že iterácia nad stromom DOM môže byť zdĺhavá a náchylná na chyby. Teraz sa pozrime na to, ako je možné lokalizovať cieľový uzol pomocou jednoduchého príkazu XPath. Vyhlásenie môže vyzerať takto:

// adresa [dieťa :: adresát [text () = 'Jim Smith']] 

Teraz môžeme prepísať našu predchádzajúcu metódu. Tentokrát použijeme príkaz XPath na nájdenie požadovaného uzla:

public Node findAddress (názov reťazca, zdroj dokumentu) vyvolá výnimku {// je potrebné znovu vytvoriť niekoľko pomocných objektov XMLParserLiaison xpathSupport = new XMLParserLiaisonDefault (); XPathProcessor xpathParser = nový XPathProcessorImpl (xpathSupport); PrefixResolver prefixResolver = nový PrefixResolverDefault (source.getDocumentElement ()); // vytvor XPath a inicializuj ho XPath xp = new XPath (); Reťazec xpString = "// adresa [dieťa :: adresát [text () = '" + meno + "']]]"; xpathParser.initXPath (xp, xpString, prefixResolver); // teraz vykonajte príkaz XPath select XObject list = xp.execute (xpathSupport, source.getDocumentElement (), prefixResolver); // vráti výsledný uzol návratový list.nodeset (). item (0); } 

Vyššie uvedený kód nemusí vyzerať oveľa lepšie ako predchádzajúci pokus, ale väčšina obsahu tejto metódy mohla byť zapuzdrená do triedy pomocníka. Jedinou časťou, ktorá sa neustále mení, je skutočný výraz XPath a cieľový uzol.

Toto nám umožňuje vytvoriť XPathHelper triedy, ktorá vyzerá takto:

import org.w3c.dom. *; import org.xml.sax. *; importovať org.apache.xalan.xpath. *; importovať org.apache.xalan.xpath.xml. *; verejná trieda XPathHelper {XMLParserLiaison xpathSupport = null; XPathProcessor xpathParser = null; PrefixResolver prefixResolver = null; XPathHelper () {xpathSupport = nový XMLParserLiaisonDefault (); xpathParser = nový XPathProcessorImpl (xpathSupport); } public NodeList processXPath (String xpath, Node target) thws SAXException {prefixResolver = new PrefixResolverDefault (target); // vytvor XPath a inicializuj ho XPath xp = new XPath (); xpathParser.initXPath (xp, xpath, prefixResolver); // teraz vykonaj príkaz XPath select XObject list = xp.execute (xpathSupport, target, prefixResolver); // vráti výsledný uzol návratový zoznam.nodeset (); }} 

Po vytvorení triedy pomocníka môžeme znova prepísať našu vyhľadávaciu metódu, ktorá je teraz veľmi krátka:

public Node findAddress (názov reťazca, zdroj dokumentu) vyvolá výnimku {XPathHelper xpathHelper = nový XPathHelper (); NodeList nl = xpathHelper.processXPath ("// adresa [dieťa :: adresát [text () = '" + meno + "']]" ", source.getDocumentElement ()); návrat nl.položka (0); } 

Triedu pomocníka je teraz možné použiť vždy, keď je v danom XML dokumente potrebné umiestniť uzol alebo množinu uzlov. Skutočný príkaz XPath je možné dokonca načítať z externého zdroja, takže v prípade zmeny štruktúry zdrojového dokumentu je možné vykonať zmeny za chodu. V takom prípade nie je potrebný žiadny preklad.

Spracovajte dokumenty XML pomocou šablón štýlov XSL

V niektorých prípadoch má zmysel outsourcovať celé spracovanie dokumentu XML na externú šablónu so štýlmi XSL, čo je proces v niektorých ohľadoch podobný použitiu XPath, ako je opísané v predchádzajúcej časti. Pomocou šablón štýlov XSL môžete vytvoriť výstupný dokument výberom uzlov zo vstupného dokumentu a ich obsahom zlúčením s obsahom šablóny štýlov na základe pravidiel vzoru.

Ak aplikácia zmení štruktúru a obsah dokumentu XML a vytvorí nový dokument, môže byť lepšie a ľahšie použiť šablónu so štýlmi na prácu, ako písať program Java, ktorý vykonáva rovnakú prácu. Šablóna so štýlmi je s najväčšou pravdepodobnosťou uložená v externom súbore, ktorý vám umožní priebežnú zmenu bez potreby novej kompilácie.

Napríklad by sme mohli dokončiť spracovanie pre adresár ukážku vytvorením šablóny štýlov, ktorá zlučuje verziu súboru adresár s aktualizovaným, čím sa vytvorí nový dokument s aktualizáciami v ňom.

Tu je ukážka takejto šablóny so štýlmi:

   //mymachine.com/changed.xml 
$config[zx-auto] not found$config[zx-overlay] not found