Programmēšana

XML dokumentu apstrāde Java, izmantojot XPath un XSLT

Extensible Markup Language (XML) noteikti ir viena no karstākajām tehnoloģijām šobrīd. Lai gan iezīmēšanas valodu jēdziens nav jauns, XML šķiet īpaši pievilcīgs Java un interneta programmētājiem. Java API XML parsēšanai (JAXP; skatīt resursus), kas nesen tika definēts, izmantojot Java kopienas procesu, sola nodrošināt kopēju saskarni, lai piekļūtu XML dokumentiem. W3C ir definējis tā saukto dokumenta objekta modeli (DOM), kas nodrošina standarta saskarni darbam ar XML dokumentu koku hierarhijā, savukārt XML vienkāršais API (SAX) ļauj programmai secīgi parsēt XML dokumentu, pamatojoties uz par notikumu apstrādes modeli. Abi šie standarti (SAX ir de facto standarts) papildina JAXP. Šīs trīs API kopā nodrošina pietiekamu atbalstu, lai tiktu galā ar XML dokumentiem Java valodā, un daudzās tirgū esošajās grāmatās ir aprakstīts to lietojums.

Šajā rakstā ir ieviests veids, kā rīkoties ar XML dokumentiem, kas pārsniedz Java standarta API, lai manipulētu ar XML. Mēs redzēsim, ka daudzos gadījumos XPath un XSLT nodrošina vienkāršākus un elegantākus lietojumprogrammu problēmu risināšanas veidus. Dažos vienkāršos paraugos mēs salīdzināsim tīru Java / XML risinājumu ar tādu, kas izmanto XPath un / vai XSLT.

Gan XSLT, gan XPath ir daļa no paplašināmās stila lapas (XSL) specifikācijas (skatiet resursus). XSL sastāv no trim daļām: pati XSL valodas specifikācija, XSL transformācijas (XSLT) un XML ceļa valoda (XPath). XSL ir valoda XML dokumentu pārveidošanai; tajā ir definīcija - Objektu formatēšana - par to, kā XML dokumentus var formatēt prezentēšanai. XSLT norāda vārdu krājumu viena XML dokumenta pārveidošanai citā. Jūs varat uzskatīt, ka XSLT ir XSL, atskaitot objektu formatēšanu. XPath valoda adresē noteiktas XML dokumentu daļas un ir paredzēta lietošanai no XSLT stila lapas.

Šajā rakstā tiek pieņemts, ka esat iepazinies ar XML un XSLT pamatiem, kā arī ar DOM API. (Lai iegūtu informāciju un konsultācijas par šīm tēmām, skatiet resursus.)

Piezīme: Šī raksta kodu paraugi tika apkopoti un pārbaudīti ar Apache Xerces XML parsētāju un Apache Xalan XSL procesoru (skat. Resursi).

Problēma

Daudzos rakstos un dokumentos, kas attiecas uz XML, teikts, ka tas ir ideāls līdzeklis, lai realizētu labu projektēšanas praksi tīmekļa programmēšanā: modeļa skata-kontroliera modeli (MVC) vai, vienkāršāk sakot, lietojumprogrammas datu nošķiršanu no prezentācijas datiem . Ja lietojumprogrammas dati ir formatēti XML formātā, tos var viegli piesaistīt, piemēram, servletī vai Java ServerPage, piemēram, HTML veidnēm, izmantojot XSL stilu lapu.

Bet XML var paveikt daudz vairāk nekā tikai palīdzēt ar modeļa skata atdalīšanu lietojumprogrammas priekšpusei. Šobrīd mēs novērojam arvien plašāku tādu komponentu (piemēram, komponentu, kas izstrādāti, izmantojot EJB standartu,) izmantošanu, kurus var izmantot lietojumprogrammu apkopošanai, tādējādi uzlabojot izstrādātāju produktivitāti. Komponentu atkārtotu lietošanu var uzlabot, formatējot datus, ar kuriem komponenti nodarbojas standarta veidā. Patiešām, mēs varam sagaidīt, ka redzēsim arvien vairāk publicētu komponentu, kas savu saskarņu aprakstam izmanto XML.

Tā kā XML formāta dati ir neitrāli valodas, tie kļūst lietojami gadījumos, kad konkrētā lietojumprogrammas klients nav zināms vai ja tam nedrīkst būt atkarības no servera. Piemēram, B2B vidēs divām pusēm var nebūt pieņemama datu apmaiņas atkarība no konkrētām Java objektu saskarnēm. Šīs prasības atbilst jaunām tehnoloģijām, piemēram, vienkāršajam objekta piekļuves protokolam (SOAP) (skatīt resursus).

Visiem šiem gadījumiem ir viena kopīga iezīme: dati tiek glabāti XML dokumentos, un ar tiem ir jārīkojas lietojumprogrammā. Piemēram, lietojumprogrammai, kas izmanto dažādus dažādu piegādātāju komponentus, visticamāk, būs jāmaina (XML) datu struktūra, lai tie atbilstu lietojumprogrammas vajadzībām vai ievērotu noteiktu standartu.

Kods, kas rakstīts, izmantojot iepriekš minētās Java API, noteikti to izdarītu. Turklāt ir pieejami arvien vairāk rīku, ar kuriem XML dokumentu var pārvērst par JavaBean un otrādi, kas atvieglo datu apstrādi no Java programmas. Tomēr daudzos gadījumos lietojumprogramma vai vismaz tās daļa tikai apstrādā vienu vai vairākus XML dokumentus kā ievades datus un pārveido tos citā XML formātā kā izvadi. Stilu lapu izmantošana šajos gadījumos ir reāla alternatīva, kā mēs redzēsim vēlāk šajā rakstā.

Izmantojiet XPath, lai atrastu mezglus XML dokumentā

Kā minēts iepriekš, XPath valoda tiek izmantota, lai atrastu noteiktas XML dokumenta daļas. Kā tāds tas ir domāts izmantošanai XSLT stila lapā, taču nekas neliedz mums to izmantot mūsu Java programmā, lai izvairītos no ilgstošas ​​iterācijas DOM elementu hierarhijā. Patiešām, mēs varam ļaut XSLT / XPath procesoram paveikt darbu mūsu vietā. Apskatīsim, kā tas darbojas.

Pieņemsim, ka mums ir lietojumprogrammas scenārijs, kurā XML avota dokuments tiek parādīts lietotājam (iespējams, pēc apstrādes stila lapā). Lietotājs atjaunina datus un, lai saglabātu tīkla joslas platumu, atpakaļ lietojumprogrammai nosūta tikai atjauninātos ierakstus. Lietojumprogramma avota dokumentā meklē XML fragmentu, kas jāatjaunina, un aizstāj to ar jaunajiem datiem.

Mēs izveidosim nelielu paraugu, kas palīdzēs jums saprast dažādas iespējas. Šajā piemērā mēs pieņemam, ka lietojumprogramma risina adreses ierakstus adrešu grāmata. Paraugs adrešu grāmata dokuments izskatās šādi:

  Džons Smits 250 18th Ave SE Rochester MN 55902 Bill Morris 1234 Center Lane NW St St. Paul MN 55123 

Lietojumprogramma (iespējams, kaut arī ne vienmēr ir serveris) saglabā adrešu grāmata atmiņā kā DOM Dokuments objekts. Kad lietotājs maina adresi, lietojumprogrammas priekšējā daļa tai nosūta tikai atjauninātu elements.

The elements tiek izmantots, lai unikāli identificētu adresi; tā kalpo kā galvenā atslēga. Īstam pielietojumam tam nebūtu daudz jēgas, taču mēs to darām šeit, lai viss būtu vienkārši.

Tagad mums ir jāuzraksta Java kods, kas mums palīdzēs identificēt avota koka elements, kas jāaizstāj ar atjaunināto elementu. The findAddress () Šī metode parāda, kā to var paveikt. Lūdzu, ņemiet vērā, ka, lai paraugs būtu īss, mēs esam izlaiduši atbilstošu kļūdu apstrādi.

publiskais mezgls findAddress (virknes nosaukums, dokumenta avots) {Element root = source.getDocumentElement (); NodeList nl = root.getChildNodes (); // atkārtojiet visus adreses mezglus un atrodiet to, kuram ir pareizs adresāts (int i = 0; i

Iepriekš minēto kodu, visticamāk, varētu optimizēt, taču ir skaidrs, ka iterēšana virs DOM koka var būt garlaicīga un pakļauta kļūdām. Tagad apskatīsim, kā mērķa mezglu var atrast, izmantojot vienkāršu XPath paziņojumu. Paziņojums varētu izskatīties šādi:

// adrese [bērns :: adresāts [teksts () = 'Džims Smits]]] 

Tagad mēs varam pārrakstīt savu iepriekšējo metodi. Šoreiz mēs izmantojam XPath paziņojumu, lai atrastu vēlamo mezglu:

public Node findAddress (virknes nosaukums, dokumenta avots) izmet izņēmumu {// jāatjauno daži palīgobjekti XMLParserLiaison xpathSupport = new XMLParserLiaisonDefault (); XPathProcessor xpathParser = jauns XPathProcessorImpl (xpathSupport); PrefixResolver prefixResolver = new PrefixResolverDefault (source.getDocumentElement ()); // izveido XPath un inicializē to XPath xp = new XPath (); Virkne xpString = "// adrese [bērns :: adresāts [teksts () = '" + vārds + "']]"; xpathParser.initXPath (xp, xpString, prefixResolver); // tagad izpildiet XPath select priekšrakstu XObject list = xp.execute (xpathSupport, source.getDocumentElement (), prefixResolver); // atgriež iegūto mezglu atgriešanās list.nodeset (). vienums (0); } 

Iepriekš minētais kods var neizskatīties daudz labāks par iepriekšējo mēģinājumu, taču lielāko daļu šīs metodes satura varētu iekapsulēt palīgu klasē. Vienīgā daļa, kas mainās atkal un atkal, ir faktiskā XPath izteiksme un mērķa mezgls.

Tas ļauj mums izveidot XPathHelper klase, kas izskatās šādi:

importēt org.w3c.dom. *; importēt org.xml.sax. *; importēt org.apache.xalan.xpath. *; importēt org.apache.xalan.xpath.xml. *; publiskā klase XPathHelper {XMLParserLiaison xpathSupport = null; XPathProcessor xpathParser = null; PrefixResolver prefixResolver = null; XPathHelper () {xpathSupport = new XMLParserLiaisonDefault (); xpathParser = jauns XPathProcessorImpl (xpathSupport); } public NodeList processXPath (String xpath, Node target) thrws SAXException {prefixResolver = new PrefixResolverDefault (target); // izveido XPath un inicializē to XPath xp = new XPath (); xpathParser.initXPath (xp, xpath, prefixResolver); // tagad izpildiet XPath select paziņojumu XObject list = xp.execute (xpathSupport, target, prefixResolver); // atgriezt iegūto mezglu atgriešanās sarakstu.nodeset (); }} 

Pēc palīgu klases izveidošanas mēs varam vēlreiz pārrakstīt savu meklētāja metodi, kas tagad ir ļoti īsa:

public Node findAddress (virknes nosaukums, dokumenta avots) izmet izņēmumu {XPathHelper xpathHelper = new XPathHelper (); NodeList nl = xpathHelper.processXPath ("// adrese [bērns :: adresāts [teksts () = '" + vārds + "']]], avots.getDocumentElement ()); atgriešanās nl.item (0); } 

Palīgu klasi tagad var izmantot ikreiz, kad noteiktā XML dokumentā ir jāatrodas mezglam vai mezglu kopumam. Faktisko XPath paziņojumu pat varēja ielādēt no ārēja avota, lai izmaiņas varētu veikt lidojumā, ja mainās avota dokumenta struktūra. Šajā gadījumā atkārtota kompilēšana nav nepieciešama.

Apstrādājiet XML dokumentus ar XSL stilu lapām

Dažos gadījumos ir lietderīgi nodot visu XML dokumenta apstrādi ārējai XSL stila lapai, process dažos aspektos ir līdzīgs XPath lietošanai, kā aprakstīts iepriekšējā sadaļā. Izmantojot XSL stilu lapas, varat izveidot izvades dokumentu, ievades dokumentā atlasot mezglus un apvienojot to saturu ar stila lapas saturu, pamatojoties uz paraugu kārtulām.

Ja lietojumprogramma maina XML dokumenta struktūru un saturu un izveido jaunu dokumentu, darba apstrādei var būt labāk un vieglāk izmantot stila lapu, nevis rakstīt Java programmu, kas veic to pašu darbu. Stilu lapa, visticamāk, tiek saglabāta ārējā failā, ļaujot to mainīt, atrodoties lidojumā, bez nepieciešamības pārkompilēt.

Piemēram, mēs varētu pabeigt adrešu grāmata paraugu, izveidojot stila lapu, kas apvieno kešatmiņā saglabāto adrešu grāmata ar atjaunināto, tādējādi izveidojot jaunu dokumentu ar tajā esošajiem atjauninājumiem.

Šeit ir šādas stila lapas paraugs:

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