Principalele Componente ale Unui Document X.m.l
XML (eXtensible Markup Language) este un descedent al SGML (Standard Generalized Markup Language) și un meta-limbaj folosit ȋn marcarea structurală a documentelor a cărui specificatii au fost pentru prima dată descrise ȋn 1996 ȋn cadrul Consorțiului World Wide Web (W3C). Prima versiune a fost standardizată ȋn 1998 iar apoi a mai primit modificări până ȋn anul 2004. Scopurile stabilite pentru acest nou meta-limbaj sunt:
– trebuie să fie simplu de utilizat pe Internet
– trebuie să poată fi folosit de o multitudine de aplicații
– trebuie să fie compatibil cu SGML
– documentele XML trebuie să fie clare, formale, concise și ușor de creat
1.2. Ce este XML?
Documentele XML sunt formate din unități de stocare numite enități care conțin date parsate sau neparsate. Cele parsate sunt alcătuite din caractere, unele formând date caracter iar altele marcaje. Marcajele codifică o desciere a schemei de stocare a documentului și structura sa logică. XML a fost creat pentru separarea sintaxei de semantică, construirea de limbaje de mark-up și asigurarea independeței de platformă.
Un document XML este un arbore ordonat etichetat și conține:
-date caracter (noduri frunză care inmagazinează datele)
-noduri elemente ce conțin un nume (tipul elementului) și atribute, care conțin la râdul lor un nume și o valoare.
Un exemplu de reprezentare de document XML este următorul:
Figura 1.1
Procesorul XML citește documentele XML și oferă acces la structura și conținutul lor rulând ȋn spatele unei aplicații.
XML este alcătuit din mai multe limbaje care au ca scop de a se adapta ușor ȋn funcție de noile tendințe de publicare a documentelor pe Internet. XML este compus din:
– XML (Extensible Markup Language)– subset al specificației SGML creat pentru implementarea mai ușoară
– XLL (Extensible Linking Language) – set al mecanismelor hipertext
– XSL (Extensible Stylesheet Language) – limbaj standard al foilor de stil care permite atașarea de semantici elementelor XML și transformarea lor ȋn alt tip de documente (HTML,MathML)
– XUA (XML User Agent) – direcție de standardizare a navigatoarelor XML
Un sistem XML este alcătuit din patru părți generale: documentul XML, definiția, tipul de document (DTD), analizorul XML și aplicația XML.
Figura 1.2
Datele procesate de un sistem XML sunt cele din documentul XML ȋn care sunt scrise informațiile folosindu-se sintaxa XML. Pentru verificarea corectitudinii reprezentării informației conform sintaxei XML, documentul este parsat de către procesorul XML numit analizor XML. Acesta returnează structura informației ȋn memorie, care apoi va fi disponibilă aplicației XML.
Dacă se doreste ca datele sa fie specificate ȋntr-un anumit fel, se atașează documentului XML un DTD (Document Type Definition) ce conține un set de reguli prin care se specifică modul ȋn care informația trebuie structurată ȋn document. Se presupune că toate analizoarele XML au același comportament, ȋnsă ȋn realitate ele diferă ȋn funcție de limbajul ȋn care va fi scrisă aplicația. Dintre cele mai cunoscute și utilizate sunt:
– IBM XML Parser pentru Java
– DataChannel Parser pentru Java (XJParser)
– Sun XML Parser pentru Java
– MSXML (analizor Microsoft de XML inclus in Internet Explorer)
1.3. Elemente specifice limbajului XML
Limbajul XML este asemănător cu limbajul HTML, ȋnsă XML este folosit pentru stocarea informației, astfel se asigură portabilitatea datelor de pe orice platformă sau dispozitiv. Elementele care fac parte din tehnologia XML sunt următoarele:
1. Fișierul propriu-zis XML, format din etichete și informațiile care sunt transmise prin intermediul acestora.
2. Declarația regulilor de validare și a tipurilor de date incluse ȋn document (DTD).
DTD are rolul de a valida conținutul și structura fișierului XML.
3. Pentru particularizarea modului de afișare a informațiilor din documentul XML este necesară utilizarea foilor de stil (XSL). Ele au rol asemănător cu fișierele CSS.
1.4. Documentele XML
Un document XML este format din marcaje (tag-uri) și date caracter. Un marcaj este un șir de caractere delimitat de “<” și “>”. Ĩn XML marcajele sunt folosite pentru a asigura o sintaxă simplă pe care analizoarele XML le pot citi și asigură o metodă de scriere ierarhică prin ȋmpărtirea informației ȋn părți numite elemente care ulterior sunt ramificate ȋn atribute.
1.4.1. Principalele componente ale unui document XML
Un document XML poate fi impărțit ȋn trei părți generale de colecții de marcaje:
1. Prolog
2. Declarația tipului de document
3. Elementul rădăcină
Fiecare dintre ele ulterior se ramifică la rândul lor ajungându-se la o structură mai detaliată descrisă ȋn următoarea schemă:
Prolog
– Comentarii
– Instrucțiuni de procesare
DOCUMENT Declarația tipului de document
XML – Comentarii
– Instrucțiuni de procesare
– Definitii
– Elemente
– Atribute
– Entități
– Notații
Elemente rădăcină
– Comentarii
– Instrucțiuni de procesare
– Elemente
– Atribute
– CDATA, entități
– PCDATA
– Referințe la entități
– Referințe la entități
– Secțiuni CDATA
Figura 1.3
1.4.2. Prologul
Ĩn general orice document XML conține un prolog. El apare tot timpul la ȋnceput de document și poate fi format din mai multe compomente: declarații XML, comentarii XML, instrucțiuni de procesare si declarații DOCTYPE ce reprezintă DTD-uri interne și/sau externe.Un exemplu de prolog poate fi:
<?xml version=”1.0” encoding=”UTF-8” standalone=”no” ?>
<!– FormularAirWings.xml –>
De cele mai multe ori, un document XML nu conține toate componentele enumerate mai sus, ȋnsă ȋn toate există pe prima linie, declarația XML. Aceasta are rolul de a indica faptul că documentul repectiv este unul XML și de a specifica versiunea de XML folosită ȋn editarea acestuia. Opțional, această linie mai poate indica setul de caractere folosit și dependența documentului XML de alte resurse externe. Forma generală a unei declarații XML este urmatoare:
<? xml version=”versiune” encoding=”set_caractere” standalone=”yes/no” ?>
Figura 1.4
Din figura 1.4 se observă următoarele atribute:
version – versiunea de XML folosită (“1.0” sau “1.1”);
encoding – setul de caractere folosit ( implicit este “UTF-8”)
standalone – acest atribut poate lua valoarea “yes” sau “no”. Daca este “yes” indică faptul că documentul curent nu depinde de alte documente externe, cum ar fi DTD-urile externe.
1.4.3. Elemente
Elementele sunt cele mai folosite componente XML. Ĩn general, numele lor au rolul de a sugera natura conținutului pe care ȋl dețin ȋntre tag-urile de ȋnceput și de sfârșit. Tag-ul de ȋnceput este tag-ul care dă și numele elementului, iar cel de sfârșit este identic cu cel de ȋnceput, doar că numele acestuia ȋncepe cu “/”. Ĩntre tag-uri se găsește conținutul elementului. Datorită facilităților care le are meta-limbajul XML, ne putem crea propriile tag-uri care să reflecte clar conținutul lor. De exemplu, elementul de mai jos, an-fabricatie este un astfel de element:
<an-fabricatie>2005</an-fabricatie>
Chiar dacă XML-ul ne oferă libertatea de a ne alege propriile elemente, sunt totuși anumite reguli de care trebuie ținut cont, cum ar fi:
– numele nu pot conține spații (de exemplu: an fabricatie);
– numele nu trebuie să ȋnceapă cu literele xml, XML, xML, …;
-numele nu trebuie să ȋnceapă cu o cifră sau cu caracterul “_”;
– numele nu trebuie să conțină caractere speciale;
– numele elementelor XML sunt case-sesitive;
Orice document XML este caracterizat de un element principal denumit element rădăcină. Acesta este un element obișnuit, numai că toate celelalte elemente ce ȋl urmează ȋi sunt subordonate. Ĩn documentele XML elementul rădăcină este primul element care se deschide și ultimul care se ȋnchide. Nu este obligatoriu ca un element XML să aibă conținut. Ele pot fi vide având posibilitatea de a fi completate ulterior. De exemplu, următorul element este vid:
<pret></pret>
1.4.4. Atribute
Atributele reprezintă perechi de genul nume=”valoarea”, care apar ȋn interiorul elementelor imediat după tag-ul de ȋnceput. Acestea conturează anumite specificații ale elementului respectiv. Figura următoarea reprezintă un exemplu de atribut XML:
< />
Figura 1.5
Un element poate conține zero, unul sau mai multe atribute. Regulile de alegere ale numelor atributelor sunt aceleași ca și ȋn cazul numelor elementelor. Valorile atributelor trebuie să fie plasate ȋntotdeauna ȋntre ghilimele simple sau duble. Atributele vide fac parte din erorile de sintaxă.
1.4.5. Comentarii
În documentele XML comentariile sunt ca și în HTML, încep cu “<!–“ și se termină cu “–>”. Ele au doar rol informativ ca și în aplicațiile de C sau Java și nu influențează cu nimic procesarea documentului. Comentariile pot fi plasate în orice loc din interiorul documentului XML și pot avea orice lungime. Trebuie avut grijă ca în interiorul comentariului să nu apară “–“.
1.4.6. Referințe la entități
Caracterele “<” și “>” sunt de obicei rezervate, însa ele pot fi introduse în continutul unui document XML însă nu ca atare ci prin intermediul entităților sau a referințelor la entități. Referirea la o entitate se face prin intermediul numelui acesteia. Referințele la entități încep cu caracterul “&” și se termină cu “;”. Între cele două caractere se găsește numele entității (&nume;) . Pentru caracterele rezervate există deja entități predefinite care sunt prezentate în tabelul următor:
Figura 1.6
Un exemplu de astfel de entitate poate fi:
<comparatie>
euro > dolar
</comparatie>
Rezultatul în urma analizei textului de către analizorul XML este:
euro > dolar
O altfel de categorie de referințe sunt entitățile caracter. Ele sunt folosite pentru inserarea de caractere Unicode în conținutul documentului XML. Sintaxa acestor entități este &#numar; unde număr poate fi reprezentat ca un număr întreg sau hexazecimal și reprezintă codul Unicode al caracterului care se dorește a fi inserat în document. Referințele mai pot fi folosite atunci când în documentul XML avem bucăți de text care se repetă. Pentru a nu le scrie de mai multe ori se defines entități care au ca valoarea acel text și de fiecare dată când trebuie introdus vom folosi referința pentru a scurta din dimensiunea documentului și din timpul alocat redactării.
1.4.7. Instrucțiuni de procesare
Instructiunile de procesare nu fac parte efectiv din documentul XML, ele sunt pasate in continutul aplicatiei care le intelege si le foloseste. Ele incep cu caracterele “<?” si se incheie cu caracterele “?>”. Imediat dupa caracterele de inceput urmeaza “tinta” utilizata pentru a identifica aplicatia carea urmeaza sa primeasca instructiunile. Cea mai cunoscuta instructiune de procesare este xml-stylesheet folosita pentru a informa o aplicatie unde sa gaseasca foaia de stiluri folosita in transformarea documentului XML. Tot o instructiune de procesare este si declaratia XML.
1.4.8. Sectiunea CDATA
Uneori este necesar ca in memontul procesarii unui document XML anumite informatii sa fie transmise aplicatiei asa cum sunt in document, fara a mai fi procesate. Acest lucru presupune ca procesorul sa ignore acele informatii iar pentru aceasta se poate apela la sectiunile CDATA. Un exemplu de astfel de sectiune este acesta:
<! [CDATA[
Pentru a comanda un avion completati urmatoarele sectiuni dupa modelul de mai jos:
<comanda>
<marca>Shark</marca>
<an-fabricatie>2005</an-fabricatie>
<pret>250000</pret>
</comanda>
//date identificare persoana fizica
<date-identificare>
<nume>Nume:Popoiu</nume>
<prenume>Prenume:Sanda</prenume>
<CNP>CNP:2930326265897</CNP>
</date-identificare>
]]>
În interiorul acestei secțiuni nu pot fi incluse alte secțiuni CDATA și trebuie evitată folosirea șirului de caractere “]]”.
1.4.9. Declarația de structură a documentului – DOCTYPE
Un document XML poate conține opțional declarații de structură prin intermediul cărora se furnizează procesorului XML informații pentru validarea documentului. O astfel de declarație poate conține:
– numele elementului rădăcină al documentului XML
– referințe la entități parametru
– o referință la un DTD extern
– un DTD intern
1.4.10. Namespaces
Este posibil ca unele tag-uri invetate de către cel care a creat documentul XML să se suprapună cu cele create de o altă persoană. În acestă situație analizatorul XML va genera eroare sau documentul va fi redat greșit. Pentru a nu întâmpina astfel de situații trebuie date denumiri unice elementelor adăugând prefixe universale pentru care se folosește mecanismul numit Namespaces. Pentru a determina zona de activitate a tag-ului este nevoie de a defini un atribut unic care descrie denumirea elementului iar apoi analizorul XML va putea să detecteze al carui grup de nume se atribuie Namespaces-ul.
1.5. Documente “bine-scrise”
Ĩnainte de validarea documentelor XML trebuie verificat că acestea sunt “bine scrise”. Pentru ca un document XML să poată fi procesat fără erori este esențial ca tag-urile sa fie corect ȋnchise. Regula de bază ȋntr-un document XML este : Ultimul tag deshis – primul tag ȋnchis. Această regulă stă la baza noțiunii de “bine scris”, iar dacă nu este respectată, documentul XML nu este considerat ȋn conformitate cu specificațiile W3C și nu va putea fi procesat sau validat.
Iată câteva reguli de bază pentru dezvoltarea unui XML”bine-scris”:
– trebuie să ȋnceapă cu o declarație XML
– trebuie să aibă un element rădăcină unic
– tag-urile XML sunt case-sensitive
– toate elementele trebuie să fie ȋnchise
– toate valorile atributelor trebuie plasate ȋntre ghilimele simple sau duble
– caracterele speciale vor fi reprezentate prin entități
1.6. Document Type Definition (DTD)
Definițiile de structură apar în interiorul declarațiilor de structură și sunt folosite pentru a evita generarea unui haos in documentele XML și pentru a nu obține rezultate greșite de la aplicațiile care folosesc aceste documente. De exemplu, avem următorul fragment XML:
<person-pf>
<Nume>Nume:_</Nume>
<Prenume>Prenume:_</Prenume>
<CNP>CNP:_</CNP>
<Numar-cont>Nr. cont:_</Numar-cont>
</person-pf>
Acest fragment este “bine scris” din punct de vedere XML dar este în același timp și logic și intuitiv. Să observam acum următorul fragment, care este altfel “aranjat”:
<CNP>
<Nume>Nume:_</Nume>
<Prenume>Prenume:_</Prenume>
<person-pf>CNP:_</person-pf>
<Numar-cont>Nr. cont:_</Numar-cont>
</CNP>
Deasemenea acest fragment de cod XML este “bine scris” numai că de data aceasta nu mai este logic ducând la extragerea de informații într-un mod eronat. Acesta este doar un exemplu care ne zice că ar trebui introduse unele constrângeri (reguli) asupra structurii unui document XML. Aceste reguli ar duce la o mai bună claritate a documentului, făcându-l ușor de înțeles și de modificat. Toate aceste lucruri se află în așa numitele DTD-uri (Document Type Definition), care sunt de două tipuri: interne și externe. Atunci când procesăm un document XML care este legat de unul DTD și nu apar erori, se spune că documentul este valid, iar dacă apar erori, acesta se numește invalid. Procesul de validare este foarte important atunci când sunt asocitate documente DTD , deoarece de rezultatul acestui proces depinde dacă XML-ul poate fi folosit sau nu ulterior de o aplicație. Atunci cand procesorul XML întâmpină un document invalid , afișează o listă cu erori ce oferă informații despre parțile de cod care nu respectă specificațiile DTD-ului. Unele procesoare XML chiar încearcă să corecteze aceste erori. Un document XML “bine-scris” dar care nu are asociat un document DTD este considerat invalid, însă procesoarele XML nu semnalează erori, deoarece asocierea de DTD nu este obligatorie și nici procesul de validare.
valid
invalid
Figura 1.7
1.6.1. Declararea unui DTD într-un document XML
Atunci când declarăm un DTD într-un document XML, în momentul procesării XML-ul este validat pe baza documentului DTD atașat. Documentul DTD poate fi declarat intern sau extern.
Declararea unui DTD intern într-un document XML
Aceste documente sunt definite în interiorul documentului XML și sunt în general cele mai utilizate deoarece atunci când se distribuie documentul XML, DTD-ul este deja incorporat. Declararea de DTD intern se face utilizând cuvântul DOCTYPE (Document Type Declaration) și respectând următoarea formă generală:
<!DOCTYPE nume_element_radacina [definitii DTD]>
definiții DTD – corpul DTD-ului format din definiții scrise pe linii separate iar parantezele patrate sunt obligatorii si au rolul de a delimita această zonă de restul documentului XML.
Declarația DTD-urile se afla tot timpul între declarația XML și elementul rădăcină.
Declararea unui DTD extern într-un document XML
Aceste documente DTD externe sunt scrise în afara documentului XML și au extensia .dtd iar conținutul lor este format din definiții DTD, la fel ca la cele de tip intern. Avantajele utilizării acestor DTD-uri externe sunt:
cu ajutorul unui document DTD se pot realiza mai multe documente XML
atunci când se dorește modificarea structurii documentelor XML este suficient să se modifice DTD-ul la care sunt legate
DTD-urile sunt de două tipuri: publice și nepublice (private). Cele publice sunt standardizate și folosite de un număr mare de utilizatori pe când cele private nu sunt standardizate și sunt destinate unui număr restrâns de documente XML.
1.7. XML Schema
Atunci când dorim să definim seturi de reguli mai complexe decât cele aflate în DTD putem apela un limbaj mai puternic numit W3C XML Schema Definition Language sau XML Schema. Fiind o alternativă DTD-urilor ele au același obiectiv ca acestea din urmă dar la un nivel mai superior. Făcând o comparație între cele două metode de aplicare de reguli avem următoarele avantaje ale schemei XML:
oferă suport pentru tipul de date
schemele sunt scrise folosind sintaxa XML
sunt ușor de întreținut și extins
1.7.1. Elementul <schema>
Acest element reprezintă elementul-rădăcină al oricărei scheme XML și tot conținutul este înscris între tag-urile <schema>…</schema> și i se pot adăuga atribute pentru a lua diverse forme. Elementele și atributele sunt definite cu ajutorul tag-urilor <ElementType> și <AttributeType> iar instanțele lor prin <element> și <attribute>. Exemplu:
<?xml version =”1.0”>
<Schema name=”SchemaMea” xmlns=http://www.airwings.org>
<ElementType name=”nume” content=”textOnly”/>
<AttributeType name=”id” required=”no”/>
</ElementType>
</Schema>
Fiecare schemă are asociat un spațiu de nume specificat prin xmlns.
Principalele componente ale XML Schema sunt elementele XML Schema, <xs:element></xs:element>, tag-uri folosite pentru a indica că urmează definiția unui element. Numele elementului este indicat de valoarea atributului name, iar tipul prin valoarea atributului type. Pe lângă elemente mai sunt și atributele, <xs:attribute></xs:attribute>, care au la rândul lor name și type.
1.8. Vizualizarea documentelor XML
Pentru a utiliza datele definite în documentul XML este necesar scrierea unui program analizator care execută elementele XML-ului. Programele analizatoare pot fi împărțite în două tabere: verificatoare (folosesc DTD-urile pentru verificarea corectitudinii documentului) și nonverificatoare. Datorită faptului că utilizarea DTD-urilor în XML nu este obligatorie toate documentele “bine-scrise” pot fi analizate fără probleme. După descompunerea documentului se obține un model-obiect ce descrie documentul și metodele de lucru cu el. Unele analizatoare folosesc DOM pentru expunerea structurii unui document.
1.9. Extensible Stylesheet Language – XSL
Ĩn acest moment există două tehnologii care fac posibilă conversia dintr-un document XML ȋn alt tip de format cum ar fi HTML: CSS (Cascading Stylesheet Language) și XSL ( Extensible Stylesheet Language). Dintre acestea cea mai apropiată de conceptele XML este XSL-ul fiind bazat pe limbajul XML și folosește stylesheet-ul pentru documentele de intrare.
Figura 1.8
Ĩn cadrul XSL sunt definite două limbaje:
XSLT – limbaj pentru transformări;
XSL Formatting Objects – transformă documentele XML ȋn documente PDF sau Microsoft Word;
Aceste două limbaje sunt folosite ȋmpreuna pentru a transforma documentele XML.
Asocierea unui XML cu un stylesheet XSLT se realizează in interiorul documentului XML cu ajutorul următoarei instrucțiuni:
<?xml-stylesheet href=”stylesheet/Login” type=”text/xsl”/>
1.10. Concluzii
XML este un limbaj care dispune de o sintaxă simplă si care permite structurarea datelor ȋntr-o manieră personalizată cu ajutorul tag-urilor care pot fi definite de către utilizator. Scopul XML-ului a fost de a permite un schimb cât mai ușor de date ȋntre aplicații și a devenit rapid un succes ȋn multe domenii.
Cap. II – Aplicația Formular AirWings
Așa cum am arătat ȋn capitolul anterior, limbajul XML poate fi folosit de mai multe tipuri de aplicații. Ĩn aplicația mea, Formular AirWings, vom folosi limbajul de programare Java datorită puterii și fiabilității de care dă dovată ȋn dezvoltarea de aplicații.
2.1. Generalități despre Java
2.1.1. O privire asupra sintaxei limbajului Java
Dau ca exemplu un program simplu care afișează la ieșirea standard textul “Hello world!”:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
Java este un limbaj de programare orientat-obiect caracterizat prin simplitate, ușurință, robustețe, portabilitate și care ȋmprumută o mare parte din sintaxă de la C și C++ dar are un model al obiectelor mai simplu și prezintă mai puține facilități de nivel jos. De obicei, programele Java sunt scrise ȋn fișiere cu extensia .java.
Ĩn Java tipurile de date sunt ȋmpărțite ȋn două categorii: tipuri primitive și tipuri referință. Ideea de bază ȋn acest limbaj de programare este că “orice este un obiect” doar că pe lângă această concepție de tip de date mai sunt și tipurile primitive, care sa ȋntâlnesc și la celelalte limbaje de programare amintite, cu mențiunea că ȋn Java nu există pointeri.
Față de aplicațiile standalone, la acest limbaj de programare apare un nou tip de aplicație numit applet și care se execută ȋn interiorul unui browser web, acest lucru ducând la ușurarea dezvoltării de aplicații web.
J2SE (Standard Edition) este platforma standard de lucru care oferă suport pentru crearea de aplicații standalone sau de applet-uri. Ĩn această platformă mai este introdusă și tehnologia Java Web Start care oferă modalități de lansare și instalare locală a programelor scrise ȋn Java direct de pe Internet.
Ĩn funcție de modul de execuție a aplicațiilor, regăsim două categorii pentru limbajele de programare: interpretate și compilate. Cele interpretate sunt citite linie cu linie de către un interpretor iar apoi instrucțiunile sunt traduse ȋn instrucțiuni mașină, pe când programele compilate au codul sursă transformat de către un compilator ȋntr-un cod care poate fi executat direct de procesor, numit și cod masina. Limbajul Java combină cele două metode. Atunci când dorim să compilăm, se va folosi compilatorul javac care creează câte un fișier separat pentru fiecare clasă a programului, acestea având extensia .class. Rularea aplicației se face cu interpretorul java apelat pentru unitatea de compilare corespunzătoare clasei principale.
Toate aplicațiile scrise ȋn Java conțin o clasă principală ȋn care trebuie să se găsească metoda main iar clasele aplicației pot sa fie ȋntr-un singur fișier sau ȋn mai multe. Este recomandat ca fișierul care conține codul sursă al clasei principale să aibă același nume cu cel al clasei.
Instrucțiunile Java sunt asemănătoare cu cele din C și se pot ȋmpărți ȋn următoarele categorii:
instrucțiuni de decizie: if-else, switch-case
instrucțiuni de salt: for, while, do-while
instrucțiuni pentru tratarea excepțiilor: try-catch-finally, throw
alte instrucțiuni: break, continue, return
2.2. Java și XML
Limbajul de programare Java conține câteva metode pentru procesarea și scrierea de documente XML. Versiunile mai vechi de Java suportau doar DOM API (Document Object Model) și SAX (Simple API for XML) API. Ĩn DOM documentele XML se pot accesa ca o ierarhie de obiecte. Deasemenea DOM se poate utiliza ȋn a citi și scrie fișiere XML. SAX este un API Java care citește secvențial documentele XML. Acest API poate doar să citească fișierele scrise ȋn limbajul XML. El mai este cunoscut și sub numele de “push-parsing mechanism” și mai are un frate numit StAX (Streaming API for XML) sau “pull-parsing mechanism”. Cele două API-uri sunt asemanătoare deoarece ambele parsează documentele XML ca pe niște fluxuri de evenimente.
Este important de reținut faptul că acest API se bazează pe două principii:
parcurge documentul XML element cu element ȋn maniera “doar inainte”
generează evenimente de genul:
– s-a intâlnit ȋnceputul documentului XML
– s-a intâlnit sfârșitul documentului XML
– s-a intâlnit tag-ul de ȋnceput al unui element
– s-a intâlnit tag-ul de sfârșit al unui element
– s-a intâlnit o instrucțiune de procesare
– s-au intâlnit date de tipul caracter
StAX oferă posibilitatea de a parcurge un document XML ȋn mod controlat, pas cu pas, de a cere anumite tipuri de evenimente sau de a parcurge atributele unui element. StAX include două API-uri care se folosesc la citirea și scrierea de documente XML numite Cursor și Event Interator. API-ul Cursor se bazează pe două interfețe din pachetul javax.xml.stream, numite XMLStreamReader si XMLStreamWriter. Obținerea de astfel de obiecte se face cu ajutorul claselor abstracte XMLInputFactory și XMLOutputFactory.
Clasa XMLStreamReader oferă atenție deosebită extragerii de informații iar acest lucru este posibil printr-un număr impresionant de metode dedicate. Pentru a afla valorile fiecărui atribut din declarația XML, această clasă folosește diferite metode cum ar fi: pentru a determina versiunea de XML se utilizează getVersion, pentru a determina setul de caractere, getCharacterEncodingScheme și pentru a determina dacă documentul XML are atașat documente externe cum ar fi DTD-urile se folosește metoda isStandalone.
Un exemplu de utilizare a metodelor enumerate ar fi:
//extragerea informatiilor din declaratia XML
public void printInfo(XMLStreamReader XMLsr){
System.out.println(“General Info”);
//obtinerea versiunii
System.out.println(“Versiune:”+XMLsr.getVersion());
//obtinerea setului de caratere
System.out.println(“Set caractere: ”+XMLsr.getCharacterEncodingScheme());
System.out.println(“Set caractere: ”+XMLsr.getEncoding());
//dependenta XML-ului de documente externe
System.out.println(“Standalone (true-yes/false-no):”+XMLsr.isStandalone());
}
La fel ca și ȋn cazul citirii de documente XML, atunci când vrem să scriem, se va folosi pachetul java.xml.stream ce definește o clasă și o interfată dedicată acestui scop, mai exact clasa XMLOutputFactory ce permite obținerea de obiecte XMLStreamWriter și interfața XMLStreamWriter. După ce s-a obținut un obiect XMLOutputFactory il putem folosi la crearea unui obiect XMLStreamWriter, apelând una din metodele createXMLStreamWriter. Odată obținut obiectul XMLStreamWriter putem ȋncepe operația de geneare a documentului XML.
Schema soluției Formular AirWings
Pentru ca această aplicație să poată rula ȋn condiții optime este necesară instalarea ultimei versiuni de jdk și de un compilator cum ar fi Eclipse.
Aplicația, prin structura sa logică este asemănătoare cu cea a oricărui alt formular, ȋndeplinind majoritatea cerințelor pe care acesta le presupune. Bineȋnțeles, acesta a fost particularizat ȋn funcție de obiectivele sale expuse ȋn prima parte a lucrării, amintind aici faptul că prin intermediul său se doreste clarificarea modului de lucru cu documentele XML, ȋn acest sens, câmpurile formularului fiind simple și precise.
O altă particularizare a acestui formular este constituită din faptul că utilizatorul este constrâns de anumite cerințe pe care trebuie să le ȋndeplinească atunci când introduce date ȋn formular. Astfel, atunci când utilizatorul dorește să cumpere un anumit număr de avioane este constrâns de numarul lor din stoc (numărul de avioane comandate nu trebuie să depășească numărul de avioane pe care le are compania la dispoziție). La următoarele câmpuri situate ȋn dreptul “Date de identificare pentru persoana fizica” numele și prenumele sunt verificate să nu fie lăsate necompletat. Deasemenea utilizatorul mai este obligat să aleagă un avion (restriscția este impusă pentru situațiile ȋn care utilizatorul uită să bifeze tipul de avion dorit).
Atunci când este selectat un avion, automat ȋn partea dreaptă a ferestrei vor apărea câteva informații despre acesta, mai exact prețul său, anul fabricației și o poză, aceste date fiind extrase din documentul XML.
După completarea numelui și prenumelui urmează CNP-ul care este verificat să fie format din 13 cifre. Atunci când se apasă butonul de “Submit” toate câmpurile sunt verificate astfel ȋncât informațiile introduse să fie valide (să ȋndeplinească condițiile scrise ȋn codul sursa) iar apoi tot ce a fost scris de catre utilizator va fi salvat ȋntr-un document XML numit “Output”.
Ĩn caz că utilizatorul dorește să mai comande un avion de un alt tip poate să mai introducă odată datele iar atunci când se dă Submit noua comandă va fi concatenată cu vechea comandă, astfel evitându-se pierderile de informații. Ĩnsă ca acest lucru să se ȋntâmple trebuie ȋndeplinită o condiție: utilizatorul nu trebuie să părăsească fereastra de lucru, altfel noua comandă o va suprascrie pe cea veche.
Pe lânga butonul de “Submit” mai există cel de “Reset” ȋn caz că nu se mai dorește continuarea efectuării comenzii.
La fel ca ȋn prima parte a formularului, ȋn cea de-a doua parte dedicată societăților comerciale sunt câmpuri care trebuie completate cu informații care să ȋndeplinească anumite condiții. Ĩn primul rând la toate textbox-urile este obligatoriu de introdus informații, altfel la executarea comenzii “Submit” se vor afișa erori cu text intuitiv despre ce anume nu s-a completat corect, iar la secțiunea “Capital” trebuie introduse doar cifre.
2.4. Documentele XML folosite
Toate informațiile care sunt folosite de aplicația Formular AirWings sunt stocate ȋn documentul XML text.xml. Acesta a fost creat cu ajutorul unui simplu editor de texte, fapt care demonstrează ușurința cu care poate fi creat acest tip de documente. Ĩn interiorul XML-ului sunt stocate datele despre avioanele aflate ȋn stoc.
Pe prima linie se află datele despre documentul XML și anume:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
Această linie de cod scrisă ȋn XML specifică versiunea de XML folosită ( poate fi 1.0 sau 1.1), setul de caractere folosit ( dacă nu era specificat nimic la secțiunea “encoding” set-ul de caractere implicit este UTF-8) și dacă documentul nostru XML depinde de documente externe cum ar fi DTD-urile sau nu, ȋn cazul nostru valoarea atributului standalone fiind “yes”.
Apoi după terminarea declarațiilor legate de documentul XML, urmează deschiderea tag-ului rădăcină <firma> urmat de tag-ul <avioane> și de atributele sale:
<firma>
<avioane>
<marca>Shark</marca>
<pret>250000$</pret>
<an-fabricatie>2005</an-fabricatie>
<poza>src/rsz_shark.bmp</poza>
<numar>5</numar>
</avioane>
Tag-ul “avioane” are ca atribute următoarele informații: marca, pret, an-fabricatie, poza și numar.
Marca reprezintă numele avionului, ȋn exemplul de față fiind “Shark”, apoi următorul atribut este prețul, care conține și un caracter special tocmai pentru a evidenția faptul că ȋntre tag-uri pot fi puse și caractere speciale cu unele condiții. Ĩn cadrul atributului “poza” se află calea către imaginea care apare ȋn interiorul aplicației atunci când este selectat un avion. Numărul indică stocul de avioane disponibile pentru a fi comandate la acel avion. Ĩn aplicație numărul introdus de către utilizator nu trebuie să fie mai mare decât numarul aflat ȋntre aceste tag-uri.
Ĩn interiorul acestui document XML pot fi introduse un număr nelimitat de avioane la care se pot adăuga noi atribute cu condiția să se modifice și codul Java pentru a putea fi citite aceste noi informații.
Trebuie avut grijă tot timpul ca tag-urile deschise să fie și ȋnschise, ȋn mod special tag-ul rădăcină trebuie ȋnchis la final, el fiind primul care se deschise și ultimul care se ȋnchide, altfel vor exista erori la citirea documentului.
Ĩn continuare voi prezenta ȋntregul cod care alcatuiește documentul meu XML:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<firma>
<avioane>
<marca>Shark</marca>
<pret>250000$</pret>
<an-fabricatie>2005</an-fabricatie>
<poza>src/rsz_shark.bmp</poza>
<numar>5</numar>
</avioane>
<avioane>
<marca>Daisy</marca>
<pret>120000$</pret>
<an-fabricatie>2004</an-fabricatie>
<poza>src/rsz_daisy.png</poza>
<numar>4</numar>
</avioane>
<avioane>
<marca>Lucy</marca>
<pret>200000$</pret>
<an-fabricatie>2006</an-fabricatie>
<poza>src/rsz_lucy.jpg</poza>
<numar>10</numar>
</avioane>
<avioane>
<marca>Hondajet</marca>
<pret>300000$</pret>
<an-fabricatie>2008</an-fabricatie>
<poza>src/rsz_hondajet.jpg</poza>
<numar>7</numar>
</avioane>
<avioane>
<marca>Hurricane</marca>
<pret>280000$</pret>
<an-fabricatie>2009</an-fabricatie>
<poza>src/rsz_huricane.jpg</poza>
<numar>3</numar>
</avioane>
<avioane>
<marca>Cessna</marca>
<pret>280000$</pret>
<an-fabricatie>2007</an-fabricatie>
<poza>src/rsz_cessna.jpg</poza>
<numar>10</numar>
</avioane>
<avioane>
<marca>G-CKSC</marca>
<pret>300000$</pret>
<an-fabricatie>2010</an-fabricatie>
<poza>src/rsz_g-cksc.jpg</poza>
<numar>1</numar>
</avioane>
<avioane>
<marca>Easy</marca>
<pret>350000$</pret>
<an-fabricatie>2011</an-fabricatie>
<poza>src/rsz_easy.png</poza>
<numar>7</numar>
</avioane>
</firma>
Ĩn urma efectuării cu succes a operației de “Submit” se creează un alt document XML numit “Output.xml” ȋn care se află informațiile introduse de către utilizator.
Ĩn acest fișier se pot introduce mai multe comenzi cu condiția să nu se iasă din fereastra formularului și să se introducă de mai multe ori informațiile cerute apăsând butonul de “Submit” de fiecare dată, altfel aplicațiava interpreta noua comandă ca fiind una individuală și o suprascrie peste cea veche.
Un exemplu de astfel de fișier rezultat ȋn urma completării formularului este:
<comenzi>
<person-SRL>
<Nume-SRL>AirWings</Nume-SRL>
<Licenta>123456</Licenta>
<Cont-SRL>BTRL0088ADBG90758493845</Cont-SRL>
<Numar-angajati>5</Numar-angajati>
<Capital>1000000</Capital>
<Tip-avion>Hurricane</Tip-avion>
<Numar-avioane-comandate>2</Numar-avioane-comandate>
</person-SRL>
<person-pf>
<Nume>Popoiu</Nume>
<Prenume>Sanda</Prenume>
<CNP>2234567890987</CNP>
<Numar-cont>BTRL0066ERTY346854367</Numar-cont>
<Tip-avion>Hurricane</Tip-avion>
<Numar-avioane-comandate>1</Numar-avioane-comandate>
</person-pf>
</comenzi>
Daca se incearca deschiderea documentului “Output.xml” cu un browser de Internet, inainte de randurile cu informatiile introduse va aparea urmatoarea afirmatie care arată că nu este nevoie de DTD-uri ca un document XML să poată fi citit:
“This XML file does not appear to have any style information associated with it. The document tree is shown below.”
2.5. Structura Formular AirWings
Asa cum am mai spus, Formular AirWings este o aplicație de sine stătătoare dezvoltată cu ajutorul tehnologiei XML având ca suport limbajul Java.
Programul este format din patru clase Java numite AirWings.java, XMLData.java, WriteXMLFile.java și SWTResourseManager.java dar și două documente XML prezentate anterior.
Formularul cu care debutează aplicația ȋn momentul lansării se află ȋn fișierul AirWings.java. El este o aplicație SWT ȋn care se află diferite câmpuri care pot fi sau nu modificate de către utilizator. Aici se introduc datele cerute ȋn formularul pentru comanda unui avion, ȋncepând cu alegerea acestuia dintr-o casetă de tip combo_box, ȋn care se afla toate numele de avioane aflate in documentul “test.xml”.
Pentru a avea o imagine mai clară asupra avionului ales, ȋn partea dreaptă a ferestrei vor apărea informațiile despre acel avion, preluat din fișierul XML ca ȋn exemplul următor:
Dacă un camp rămâne necompletat aplicația returnează o eroare cu un mesaj specific ȋn funcție de câmpul necompletat. De mentionat este că nu trebuie completate ambele părți ale formularului, ci doar una, ȋn funcție dacă utilizatorul este persoană fizică sau societate comercială. Un exemplu de eroare afișată ȋn urma execuției butonului “Submit” este următoarea:
Aceste erori sunt menționate ȋn interiorul codului astfel:
public void widgetSelected(SelectionEvent e) {
if(combo_1.getSelectionIndex()==0) JOptionPane.showMessageDialog(null, "Va rugam alegeti avionul dorit", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(nrAvioane.getText().equals("")) JOptionPane.showMessageDialog(null, "Va rugam introduceti numarul de avioane dorite", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(numePF.getText().equals("")) JOptionPane.showMessageDialog(null, "Va rugam introduceti numele", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(prenumePF.getText().equals("")) JOptionPane.showMessageDialog(null, "Va rugam introduceti prenumele", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(CNP.getText().equals("")) JOptionPane.showMessageDialog(null, "Va rugam introduceti CNP-ul", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(nrCont.getText().equals("")) JOptionPane.showMessageDialog(null, "Va rugam introduceti numarul contului.", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(CNP.getText().length()!=13) JOptionPane.showMessageDialog(null, "CNP incorect.", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(CNP.getText().matches("[0-9]+")==false) JOptionPane.showMessageDialog(null, "CNP incorect.", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(nrAvioane.getText().matches("[0-9]+")==false) JOptionPane.showMessageDialog(null, "Numarul de avioane incorect.", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(Integer.parseInt(nrAvioane.getText())>XMLData.getNumber(combo_1.getText())) JOptionPane.showMessageDialog(null, "Numarul de avioane depaseste stocul.", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
respectiv ( ȋn funcție de cumpărător):
public void widgetSelected(SelectionEvent e) {
if(combo_1.getSelectionIndex()==0) JOptionPane.showMessageDialog(null, "Va rugam alegeti avionul dorit", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(nrAvioane.getText().equals("")) JOptionPane.showMessageDialog(null, "Va rugam introduceti numarul de avioane dorite", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(numeSRL.getText().equals("")) JOptionPane.showMessageDialog(null, "Va rugam introduceti numele SRL", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(licenta.getText().equals("")) JOptionPane.showMessageDialog(null, "Va rugam introduceti licenta", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(contSRL.getText().equals("")) JOptionPane.showMessageDialog(null, "Va rugam introduceti contul SRL", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(nrAngajati.getText().equals("")) JOptionPane.showMessageDialog(null, "Va rugam introduceti numarul de angajati.", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(capital.getText().equals("")) JOptionPane.showMessageDialog(null, "Va rugam introduceti capitalul.", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(combo.getSelectionIndex()==0) JOptionPane.showMessageDialog(null, "Va rugam alegeti moneda dorita", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(capital.getText().matches("[0-9]+")==false) JOptionPane.showMessageDialog(null, "Capital incorect.", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(nrAvioane.getText().matches("[0-9]+")==false) JOptionPane.showMessageDialog(null, "Numarul de avioane incorect.", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
else if(Integer.parseInt(nrAvioane.getText())>XMLData.getNumber(combo_1.getText())) JOptionPane.showMessageDialog(null, "Numarul de avioane depaseste stocul.", "InfoBox: ", JOptionPane.ERROR_MESSAGE);
Programul va ști care set de condiții să le analizeze ȋn funcție de care din cele două butoane de submit este apăsat.
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Principalele Componente ale Unui Document X.m.l (ID: 150149)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
