CodeGym /Blog Java /Aleatoriu /XML în Java
John Squirrels
Nivel
San Francisco

XML în Java

Publicat în grup
Bună! Astăzi vom introduce un alt format de date numit XML. Acesta este un subiect foarte important. Când lucrați la aplicații Java reale, aproape sigur veți întâlni sarcini legate de XML. În dezvoltarea Java, acest format este folosit aproape universal (vom afla de ce mai jos), așa că vă recomand să nu revizuiți superficial această lecție, ci mai degrabă să obțineți o înțelegere aprofundată a totul și, de asemenea, să studiați literatură/linkuri suplimentare :) cu siguranță nu va fi o pierdere de timp. Deci, să începem cu lucrurile ușoare: „ce” și „de ce”!

Ce este Java XML?

XML înseamnă eXtensible Markup Language. Este posibil să fiți deja familiarizați cu un limbaj de marcare - ați auzit de HTML, care este folosit pentru a crea pagini web :) Ce este XML?  - 1HTML și XML au chiar un aspect similar:
HTML 1

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 1

<headline>title</headline>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
HTML 2

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 2

<chief>title</chief>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
Cu alte cuvinte, XML este un limbaj pentru descrierea datelor.

De ce ai nevoie de XML?

XML a fost inventat inițial pentru a stoca și a trimite mai convenabil date, inclusiv prin Internet. Are câteva avantaje care vă ajută să realizați acest lucru. În primul rând, este ușor de citit atât de un om, cât și de un computer. Cred că puteți înțelege cu ușurință ce descrie acest fișier XML:

<?xml version="1.0" encoding="UTF-8"?>
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
De asemenea, un computer înțelege cu ușurință acest format. În al doilea rând, deoarece datele sunt stocate ca text simplu, nu vor exista probleme de compatibilitate atunci când le transferăm de la un computer la altul. Este important să înțelegeți că XML nu este un cod executabil - este un limbaj de descriere a datelor. După ce descrieți datele folosind XML, trebuie să scrieți cod (de exemplu, în Java) care poate trimite/primi/procesa aceste date.

Cum este structurat XML?

Componenta principală este etichetele: acestea sunt lucrurile din paranteze unghiulare:

<book>
</book>
Există etichete de deschidere și etichete de închidere. Eticheta de închidere are un simbol suplimentar (" / "), așa cum se poate vedea în exemplul de mai sus. Fiecare etichetă de deschidere trebuie să aibă o etichetă de închidere. Acestea arată unde începe și unde se termină descrierea fiecărui element din fișier. Etichetele pot fi imbricate! În exemplul nostru de carte, eticheta <carte> are 3 etichete imbricate: <titlu>, <autor> și <an>. Acest lucru nu se limitează la un nivel de imbricare: etichetele imbricate pot avea propriile etichete imbricate etc. Această structură se numește arbore de etichete. Să ne uităm la acest arbore folosind un exemplu de fișier XML care descrie un dealer auto:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
Aici avem o etichetă de nivel superior: <magazin auto>. Se mai numește și element rădăcină. <mașină> are o etichetă secundară: <mașină>. <mașină>, la rândul său, are și 3 etichete copil: <model>, <an> și <preț>. Fiecare etichetă poate avea atribute, care conțin informații suplimentare importante. În exemplul nostru, eticheta <model> are un atribut „lang”, care indică limba folosită pentru înregistrarea numelui modelului:

<model lang="en">Scania R 770</model>
Aici indicăm că numele este scris în engleză. Eticheta noastră <price> are un atribut „currency”.

<price currency="US dollar">150000.00</price>
Aici indicăm că prețul mașinii este dat în dolari SUA. Astfel, XML are o sintaxă „auto-descriere”. Puteți adăuga orice informații de care aveți nevoie pentru a descrie datele. În plus, în partea de sus a fișierului, puteți adăuga o linie care indică versiunea XML și codificarea utilizată pentru a scrie datele. Acesta se numește „prolog” și arată astfel:

<?xml version="1.0" encoding="UTF-8"?>
Utilizăm XML versiunea 1.0 și codificarea UTF-8. Acest lucru nu este necesar, dar poate fi util dacă, de exemplu, fișierul dvs. folosește text în diferite limbi. Am menționat că XML înseamnă „eXtensible Markup Language”, dar ce înseamnă „extensible”? Aceasta înseamnă că este perfect pentru a crea versiuni noi ale obiectelor și fișierelor dvs. De exemplu, să presupunem că vrem să începem și să vindem motociclete la reprezentanța noastră auto! Acestea fiind spuse, avem nevoie de programul nostru să accepte ambele versiuni de <carstore>: cea veche (fără motociclete) și cea nouă. Iată versiunea noastră veche:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
Și iată-l pe cel nou extins:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
   <motorcycle>
       <title lang="en">Yamaha YZF-R6</title>
       <year>2018</year>
       <price currency="Russian Ruble">1000000.00</price>
       <owner>Vasia</owner>
   </motorcycle>
   <motorcycle>
       <title lang="en">Harley Davidson Sportster 1200</title>
       <year>2011</year>
       <price currency="Euro">15000.00</price>
       <owner>Petia</owner>
   </motorcycle>
</carstore>
Așa este cât de ușor și simplu este să adăugați o descriere a motocicletelor în dosarul nostru :) În plus, nu este nevoie să avem aceleași etichete pentru motociclete ca și pentru mașini. Vă rugăm să rețineți că motocicletele, spre deosebire de mașini, au un element <owner>. Acest lucru nu împiedică computerul (sau om) să citească datele.

Diferențele dintre XML și HTML

Am spus deja că XML și HTML sunt foarte asemănătoare ca aspect. Acest lucru face ca este foarte important să știm cum diferă. În primul rând, sunt folosite în scopuri diferite. HTML este pentru marcarea paginilor web. De exemplu, în timpul creării unui site web, puteți folosi HTML pentru a specifica: „Meniul ar trebui să fie în colțul din dreapta sus. Ar trebui să aibă așa și așa butoane”. Cu alte cuvinte, sarcina HTML este să afișeze date. XML este pentru stocarea și trimiterea de informații într-o formă convenabilă pentru oameni și computere. Acest format nu conține nicio indicație despre cum ar trebui să fie afișate aceste date: asta depinde de codul programului care le citește. În al doilea rând, există o diferență tehnică majoră. Etichetele HTML sunt predefinite. Cu alte cuvinte, crearea unui antet HTML (de exemplu, o legendă mare în partea de sus a paginii) folosește numai <h1></h1> etichetele (<h2></h2> și <h3></h3> sunt folosite pentru anteturile mai mici). Nu puteți crea antete HTML folosind alte etichete. XML nu utilizează etichete predefinite. Puteți da etichetelor orice nume doriți: <header>, <title>, <idontknow2121>.

Rezolvarea conflictului

Libertatea pe care o oferă XML poate duce la unele probleme. De exemplu, una și aceeași entitate (de exemplu, o mașină) poate fi utilizată de un program în scopuri diferite. De exemplu, avem un fișier XML care descrie mașini. Cu toate acestea, programatorii noștri nu au ajuns la un acord prealabil între ei. Și acum, pe lângă datele despre mașinile reale, s-ar putea să găsim date despre mașinile de jucărie în XML-ul nostru! În plus, au aceleași atribute. Să presupunem că programul nostru citește într-un astfel de fișier XML. Cum deosebim o mașină adevărată de o mașină de jucărie?

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">100.00</price>
   </car>
</carstore>
Aici prefixele și spațiul de nume ne vor ajuta. Pentru a distinge în programul nostru mașinile de jucărie de cele reale (și într-adevăr orice jucărie din omologii lor reale), introducem două prefixe: „real” și „jucărie”.

<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
Acum programul nostru va putea face distincția între diferitele entități! Tot ceea ce are prefixul de jucărie va fi tratat ca jucării :) Cu toate acestea, încă nu am terminat. Pentru a folosi prefixe, trebuie să înregistrăm fiecare dintre ele ca spațiu de nume. De fapt, „înregistrare” este un cuvânt puternic :) Trebuie pur și simplu să venim cu un nume unic pentru fiecare dintre ele. Este ca și în cazul claselor: o clasă are un nume scurt ( Cat ) și un nume complet calificat care include toate pachetele ( zoo.animals.Cat). Un URI este de obicei folosit pentru a crea un nume unic de spațiu de nume. Uneori, acest lucru se face folosind o adresă de Internet, unde sunt descrise funcțiile acestui spațiu de nume. Dar nu trebuie să fie o adresă de internet validă. Foarte des, proiectele folosesc pur și simplu șiruri asemănătoare URI care ajută la urmărirea ierarhiei spațiilor de nume. Iată un exemplu:

<?xml version="1.0" encoding="UTF-8"?>
<carstore xmlns:real="http://testproject.developersgroup1.companyname/department2/namespaces/real"
         xmlns:toy="http://testproject.developersgroup1.companyname/department2/namespaces/toy">
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
</carstore>
Desigur, nu există un site web la „http://testproject.developersgroup1.companyname/department2/namespaces/real” Dar acest șir conține informații utile: dezvoltatorii Grupului 1 din Departamentul 2 sunt responsabili pentru crearea spațiului de nume „real” . Dacă trebuie să introducem nume noi sau să discutăm despre posibile conflicte, vom ști unde să apelăm. Uneori, dezvoltatorii folosesc o adresă web descriptivă reală ca nume unic de spațiu de nume. De exemplu, acesta poate fi cazul unei companii mari al cărei proiect va fi folosit de milioane de oameni din întreaga lume. Dar acest lucru cu siguranță nu se face întotdeauna: Stack Overflow are o discuție despre această problemă. În general, nu există o cerință strictă de a folosi URI-uri ca nume de spații de nume: puteți utiliza pur și simplu șiruri aleatorii. Această opțiune ar funcționa și:

xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Acestea fiind spuse, utilizarea unui URI are mai multe avantaje. Puteți citi mai multe despre asta chiar aici .

Standarde XML de bază

Standardele XML sunt un set de extensii care adaugă funcționalități suplimentare fișierelor XML. XML are o mulțime de standarde, dar ne vom uita doar la cele mai importante și vom afla că ele fac posibil AJAX, care este unul dintre cele mai cunoscute standarde XML. Vă permite să schimbați conținutul unei pagini web fără a o reîncărca! XSLT vă permite să convertiți text XML în alte formate. De exemplu, puteți utiliza XSLT pentru a converti XML în HTML! După cum am spus, scopul XML este de a descrie date, nu de a le afișa. Dar cu XSLT putem ocoli această limitare! XML DOM vă permite să preluați, să modificați, să adăugați sau să ștergeți elemente individuale dintr-un fișier XML. Iată un mic exemplu despre cum funcționează acest lucru. Avem un fișier books.xml:

<bookstore>
   <book category="cooking">
       <title lang="en">Everyday Italian</title>
       <author>Giada De Laurentiis</author>
       <year>2005</year>
       <price>30.00</price>
   </book>
   <book category="children">
       <title lang="en">Harry Potter</title>
       <author>J. K. Rowling</author>
       <year>2005</year>
       <price>29.99</price>
   </book>
</bookstore>
Are două cărți. Cărțile au un element <title>. Aici putem folosi JavaScript pentru a obține toate titlurile cărților din fișierul nostru XML și pentru a-l imprima pe primul pe consolă:

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
  myFunction(this);
  }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
  document.getElementById("demo").innerHTML =
  xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>

</body>
</html>
DTD ("definiția tipului de document") vă permite să definiți o listă de elemente permise pentru o entitate într-un fișier XML. De exemplu, să presupunem că lucrăm la un site web de librărie și că toate echipele de dezvoltare sunt de acord că numai atributele titlu, autor și an ar trebui specificate pentru elementele cărții din fișierele XML. Dar cum ne protejăm de neglijență? Foarte usor!

<?xml version="1.0"?>
<!DOCTYPE book [
       <!ELEMENT book (title,author,year)>
       <!ELEMENT title (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT year (#PCDATA)>
       ]>

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
</book>
Aici am definit o listă de atribute valide pentru <book>. Încercați să adăugați un element nou acolo și veți primi imediat o eroare!

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
Eroare! „Elementul mainhero nu este permis aici” Există multe alte standarde XML. Puteți să vă familiarizați cu fiecare dintre ele și să încercați să aprofundați codul. Oricum, dacă ai nevoie de informații despre XML, poți găsi aproape totul acolo :) Și odată cu asta, lecția noastră se termină. Este timpul să ne întoarcem la sarcini! :) Pana data viitoare!
Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION