Procesarea documentelor XML utilizând XPath și XSLT
Acest articol discută modalități de a reduce complexitatea codului Java atunci când procesați documente XML utilizând XPath și XSLT.
Limba extensibilă de marcare (XML) reprezintă, fără îndoială, una dintre cele mai vii tehnologii ale timpului nostru. Deși conceptul de limbaj de marcare nu este deloc nou, XML sa dovedit deosebit de atractiv pentru programatorii din Java și Internet. API-ul Java pentru XML Parsing (JAXP; vezi resurse.) Recent definite Java Process comunitate, aparent duce la crearea de documente XML acces la interfață universală. W3C a descris așa-numitul Document Object Model (DOM), care servește ca o interfață standard pentru lucrul cu documente XML într-o ierarhie copac, în timp ce un simplu API pentru XML (SAX) oferă un mod programatic de procesare secvențială a documentului XML bazat pe modelul evenimentului. Ambele standarde (cu SAX fiind standardul de facto) completează JAXP. Împreună, aceste trei API-uri standard oferă suport eficient pentru procesarea documentelor XML în Java, iar utilizarea lor este descrisă în numeroase cărți.
Acest articol discută metodele de procesare a documentelor XML care depășesc standardul Java API utilizat în acest scop. Vom vedea că în multe cazuri XPath și XSLT oferă o modalitate mai simplă și mai elegantă de a rezolva sarcinile atribuite aplicației. Pe exemple simple, comparăm o soluție bazată pe codul Java pur pentru XML cu o soluție care utilizează XPath și / sau XSLT.
XSLT și XPath fac parte din specificația Extensible Stylesheet Language (XSL) (a se vedea Resurse). XSL constă din trei părți: specificațiile limbii XSL în sine, filtrelor XSL (XSLT) și limbajului XML path (XPath). XSL - o limbă pentru descrierea transformării documentelor XML; conține definițiile conform cărora obiectele de date XML ale documentelor sunt reformulate în reprezentarea vizuală necesară. XSLT definește un set de comenzi pentru conversia unui document XML în altul. Putem presupune că XSLT este XSL, minus obiectele de date. Limba XPath este utilizată în secțiuni speciale ale documentelor XML și este destinată utilizării în foile de stil XSLT.
În viitor, acest articol presupune că cititorul este familiarizat cu elementele de bază ale XML și XSLT, precum și cu DOM API. (Pentru informații despre aceste probleme, consultați lista de resurse de la sfârșitul articolului.)
Exemple de cod de program prezentate în acest articol au fost compilate și depanate folosind XML-Parzer companiei Apache Xerces și procesor XSL Xalan de la aceeași companie (a se vedea resurse.).
Formularea problemei
Totuși, XML oferă oportunități mult mai mari decât simpla separare a modelului și a vizualizării din punctul de vedere al scopului final al aplicației. În prezent, componentele (de exemplu, componentele dezvoltate în conformitate cu standardul EJB) sunt utilizate din ce în ce mai mult, care pot fi folosite pentru a construi aplicații, îmbunătățind astfel performanța. Reutilizarea componentelor poate fi îmbunătățită prin formatarea datelor prelucrate de aceste componente în mod obișnuit. De fapt, ne putem aștepta la o creștere a numărului de componente care folosesc XML pentru a descrie interfețele lor.
Deoarece datele formate în XML sunt independente de limbă, este posibil să le utilizeze în cazurile în care clientul unei aplicații nu este definit exact sau când este necesar să se asigure independența acestuia de server. De exemplu, în mediul B2B, dependența celor două părți implicate în schimbul de date de o anumită interfață de obiect Java poate să nu fie acceptabilă. Aceste cerințe sunt avansate de noile tehnologii, cum ar fi Protocolul de Acces Simplu pentru Obiecte (SOAP) (a se vedea Resursele).
Toate aceste cazuri au un lucru în comun: datele sunt stocate în documente XML și trebuie prelucrate de o anumită aplicație. De exemplu, într-o aplicație care utilizează componente diferite de la furnizori diferiți, va trebui cel mai probabil să schimbați structura de date (XML) pentru a îndeplini cerințele aplicației sau pentru a îndeplini un anumit standard.
Codul de mai sus din Java îndeplinește cu siguranță toate aceste cerințe. Mai mult decât atât, există un număr tot mai mare de mijloace prin care utilizatorul poate transforma un document XML în JavaBean și înapoi, oferind o metodă simplă de prelucrare a datelor într-un program în Java. În multe cazuri, totuși, o aplicație sau unele dintre funcțiile sale doar procesează unul sau mai multe documente XML care vin ca informații de intrare și le transformă în alte documente XML la ieșire. În aceste cazuri, utilizarea stilurilor este o alternativă bună, așa cum vom arăta mai târziu în acest articol.
Utilizarea XPath pentru a găsi elemente de document XML
După cum sa menționat mai sus, limbajul XPath este folosit pentru a găsi anumite părți ale unui document XML. Acest lucru implică faptul că este utilizat filtru XSLT, dar nimic nu ne împiedică utilizarea acestuia într-un program Java pentru a evita iterații lungi prin ierarhia elementelor DOM. De fapt, putem obține procesorul XSLT / XPath să lucreze pentru noi. Luați în considerare modul în care puteți implementa această lucrare.
Să presupunem că scriptul aplicației noastre presupune că textul sursă al documentului XML este prezentat utilizatorului (posibil după conversie utilizând un filtru). Utilizatorul efectuează modificări ale datelor și reducerea încărcării în rețea, trimite numai înregistrările modificate înapoi la aplicație. Aplicația caută în documentul sursă un fragment XML în care se fac modificările și înlocuiește datele sale cu cele noi.
Acum trebuie să scriem un cod Java care să ne ajute să determinăm acel element
în arborele sursă, al cărui conținut trebuie înlocuit cu informații din elementul modificat. Să ilustrăm acest lucru cu ajutorul metodei findAddress (). al cărui cod este prezentat mai jos. Rețineți că pentru a reduce dimensiunea codului din exemplu, a fost omisă manipularea erorilor.Codul de mai sus poate fi cel mai probabil optimizat, dar este evident că iterarea peste arborele DOM poate fi obositoare și greșită. Luați în considerare acum posibilitățile de utilizare a unei simple instrucțiuni XPath pentru a găsi nodul țintă. Instrucțiunea poate arăta astfel:
Acum puteți suprascrie metoda anterioară. De data aceasta, vom folosi expresia XPath pentru a găsi nodul de care avem nevoie:
Codul afișat aici probabil nu arată mult mai bine decât în exemplul anterior, dar cea mai mare parte a conținutului acestei metode poate fi ascunsă în clasa de ajutor. Singura parte care se va schimba în mod constant este expresia XPATH și nodul țintă.
Deci, putem crea o clasă XPathHelper. care va arata astfel:
După crearea unei clase de ajutor, putem rescrie principala noastră metodă, care va deveni acum destul de scurtă:
Clasa helper poate fi utilizată ori de câte ori trebuie să găsiți un nod sau un grup de noduri în acest document XML. XPath reală de ghidare poate fi chiar și încărcate de la o sursă externă, astfel încât schimbările se poate face pe zbor în cazul în care modificările de structură ale documentului original. În acest caz, nici măcar nu trebuie să compilați.
Procesarea unui document XML utilizând filtre XSL
În unele cazuri, este logic la întreaga procesare a documentelor XML aduce pe deplin într-un XSL filtru extern, în unele privințe, acest proces este similar cu utilizarea XPath, așa cum sa discutat în secțiunea anterioară. Cu ajutorul filtrelor XSL pot crea documente de ieșire de la nodurile de intrare pentru acest document și asocierea conținutului cu conținutul regulilor de filtrare specificate în aceasta din urmă.
De exemplu, puteți procesa agenda de adrese exemplu creând o foaie de stil care combină versiunea existentă a agendei de adrese cu cea actualizată, creând un document nou cu toate modificările reflectate în el.
Iată un exemplu al unui astfel de filtru:
Rețineți că foaia de stil de mai sus are date modificate dintr-un fișier numit changed.xml. Evident, într-o aplicație reală, nu aș vrea să salvez datele modificate într-un fișier înainte de a le procesa. Soluția la această problemă este de a adăuga un atribut special elementului
. care indică faptul că elementul a fost modificat. Apoi, aplicația ar putea pur și simplu să adauge datele modificate în documentul sursă și să definească o foaie de stil separată care să detecteze intrările modificate și să le înlocuiască cu cele vechi.Acum aplicația trebuie să creeze un obiect XSLTProcessor și să-i dea toată munca:
concluzie
Pentru majoritatea programatorilor din Java, XML este o tehnologie relativ nouă, care trebuie să fie stăpânită. Acest articol arată că parsarea manuală și procesarea documentelor XML este una dintre opțiunile pe care le puteți utiliza expresii XPath și filtre XSL pentru a scapa de o cantitate mare de prelucrare în codul și iterațiile, reducând astfel dimensiunea de cod. Mai mult, într-un astfel de sistem, informațiile despre modul de procesare a datelor sunt stocate în fișiere externe, astfel încât acestea se pot schimba fără a recompila codul sursă al aplicației. Mecanismul descris aici poate fi folosit pentru a crea date de prezentare pentru aplicațiile Web, dar poate fi utilizat și în toate cazurile în care este necesară procesarea datelor XML.
Andre Toast lucrează ca inginer de software de consultanță în echipa de dezvoltare a IBM din Rochester, Minnesota. A absolvit Academia Profesională din Stuttgart, Germania și a lucrat la diverse proiecte de dezvoltare orientată spre obiecte în ultimii șase ani. El lucrează în prezent în WebSphere Business Componente tehnice Architecture Group IBM, care este specializată în utilizarea mecanismelor XML și XSL.
Articole XML recente în JavaWorld
Alte resurse valoroase legate de XML