Hoi! Vandaag introduceren we een ander dataformaat genaamd XML. Dit is een heel belangrijk onderwerp. Wanneer u aan echte Java-toepassingen werkt, zult u vrijwel zeker XML-gerelateerde taken tegenkomen. Bij Java-ontwikkeling wordt dit formaat bijna universeel gebruikt (we zullen hieronder ontdekken waarom), dus ik raad je aan deze les niet oppervlakkig te bekijken, maar om een ​​grondig begrip van alles te krijgen en ook aanvullende literatuur/links te bestuderen :) Dit zal zeker geen tijdverspilling zijn. Dus laten we beginnen met de gemakkelijke dingen: het "wat" en het "waarom"!

Wat is Java-XML?

XML staat voor eXtensible Markup Language. Je bent misschien al bekend met een opmaaktaal - heb je wel eens gehoord van HTML, dat wordt gebruikt om webpagina's te maken :) Wat is XML?  - 1HTML en XML zien er zelfs hetzelfde uit:
HTML1

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
xml1

<headline>title</headline>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
HTML2

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
xml2

<chief>title</chief>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
Met andere woorden, XML is een taal voor het beschrijven van gegevens.

Waarom heb je XML nodig?

XML is oorspronkelijk uitgevonden om gegevens gemakkelijker op te slaan en te verzenden, ook via internet. Het heeft verschillende voordelen die u helpen dit te bereiken. Ten eerste is het gemakkelijk te lezen door zowel een mens als een computer. Ik denk dat je gemakkelijk kunt begrijpen wat dit XML-bestand beschrijft:

<?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>
Een computer begrijpt dit formaat ook gemakkelijk. Ten tweede, aangezien de gegevens als platte tekst worden opgeslagen, zullen er geen compatibiliteitsproblemen zijn wanneer we deze van de ene computer naar de andere overbrengen. Het is belangrijk om te begrijpen dat XML geen uitvoerbare code is — het is een databeschrijvingstaal. Nadat u gegevens hebt beschreven met behulp van XML, moet u code schrijven (bijvoorbeeld in Java) die deze gegevens kan verzenden/ontvangen/verwerken.

Hoe is XML gestructureerd?

Het belangrijkste onderdeel zijn tags: dit zijn de dingen tussen punthaken:

<book>
</book>
Er zijn openingstags en sluittags. De afsluitende tag heeft een extra symbool (" / "), zoals te zien is in het bovenstaande voorbeeld. Elke openingstag moet een sluitingstag hebben. Ze laten zien waar de beschrijving van elk element in het bestand begint en eindigt. Tags kunnen worden genest! In ons boekvoorbeeld heeft de tag <book> 3 geneste tags: <title>, <author> en <year>. Dit is niet beperkt tot één niveau van nesting: geneste tags kunnen hun eigen geneste tags hebben, enz. Deze structuur wordt een tagboom genoemd. Laten we eens kijken naar deze boom met behulp van een voorbeeld van een XML-bestand dat een autodealer beschrijft:

<?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>
Hier hebben we een tag op het hoogste niveau: <carstore>. Het wordt ook wel een root-element genoemd. <carstore> heeft één onderliggende tag: <car>. <auto> heeft op zijn beurt ook 3 onderliggende tags: <model>, <jaar> en <prijs>. Elke tag kan attributen hebben, die aanvullende belangrijke informatie bevatten. In ons voorbeeld heeft de tag <model> een "lang"-attribuut, dat de taal aangeeft die wordt gebruikt om de modelnaam vast te leggen:

<model lang="en">Scania R 770</model>
Hier geven we aan dat de naam in het Engels is geschreven. Onze <price> tag heeft een "currency" attribuut.

<price currency="US dollar">150000.00</price>
Hier geven we aan dat de prijs van de auto wordt gegeven in Amerikaanse dollars. XML heeft dus een "zelfbeschrijvende" syntaxis. U kunt alle informatie toevoegen die u nodig heeft om de gegevens te beschrijven. Bovendien kunt u bovenaan het bestand een regel toevoegen die de XML-versie aangeeft en de codering die is gebruikt om de gegevens te schrijven. Dit wordt de "proloog" genoemd en het ziet er zo uit:

<?xml version="1.0" encoding="UTF-8"?>
We gebruiken XML versie 1.0 en UTF-8-codering. Dit is niet nodig, maar het kan handig zijn als uw bestand bijvoorbeeld tekst in verschillende talen gebruikt. We zeiden dat XML "eXtensible Markup Language" betekent, maar wat betekent "extensible"? Dit betekent dat het perfect is voor het maken van nieuwe versies van uw objecten en bestanden. Stel dat we ook motorfietsen willen gaan verkopen bij onze autodealer! Dat gezegd hebbende, ons programma moet beide versies van <carstore> ondersteunen: de oude (zonder motorfietsen) en de nieuwe. Hier is onze oude versie:

<?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>
En hier is de nieuwe uitgebreide:

<?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>
Zo makkelijk en simpel is het om een ​​omschrijving van motoren aan ons bestand toe te voegen :) Bovendien hoeven we voor motoren absoluut niet dezelfde kind-tags te hebben als voor auto's. Houd er rekening mee dat motorfietsen, in tegenstelling tot auto's, een <eigenaar>-element hebben. Dit weerhoudt de computer (of mens) er niet van om de gegevens te lezen.

Verschillen tussen XML en HTML

We hebben al gezegd dat XML en HTML qua uiterlijk sterk op elkaar lijken. Dat maakt het erg belangrijk om te weten hoe ze verschillen. Ten eerste worden ze voor verschillende doeleinden gebruikt. HTML is voor het markeren van webpagina's. Bij het maken van een website kunt u bijvoorbeeld HTML gebruiken om te specificeren: "Het menu moet in de rechterbovenhoek staan. Het moet die en die knoppen hebben". Met andere woorden, de taak van HTML is om gegevens weer te geven. XML is voor het opslaan en verzenden van informatie in een vorm die handig is voor mens en computer. Dit formaat bevat geen enkele indicatie hoe deze gegevens moeten worden weergegeven: dat hangt af van de code van het programma dat ze leest. Ten tweede is er een groot technisch verschil. HTML-tags zijn vooraf gedefinieerd. Met andere woorden, het maken van een HTML-header (bijvoorbeeld een groot bijschrift bovenaan de pagina) gebruikt alleen <h1></h1> tags (<h2></h2> en <h3></h3> worden gebruikt voor kleinere headers). U kunt geen HTML-headers maken met andere tags. XML maakt geen gebruik van vooraf gedefinieerde tags. U kunt tags elke gewenste naam geven: <header>, <title>, <idontknow2121>.

Conflictoplossing

De vrijheid die XML biedt, kan tot enkele problemen leiden. Een en dezelfde entiteit (bijvoorbeeld een auto) kan bijvoorbeeld door een programma voor verschillende doeleinden worden gebruikt. We hebben bijvoorbeeld een XML-bestand dat auto's beschrijft. Onze programmeurs hebben onderling echter geen voorafgaande overeenstemming bereikt. En nu kunnen we naast gegevens over echte auto's ook gegevens over speelgoedauto's vinden in onze XML! Bovendien hebben ze dezelfde eigenschappen. Laten we zeggen dat ons programma zo'n XML-bestand inleest. Hoe onderscheiden we een echte auto van een speelgoedauto?

<?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>
Hier zullen voorvoegsels en naamruimte ons helpen. Om speelgoedauto's in ons programma te onderscheiden van echte auto's (en inderdaad al het speelgoed van hun echte tegenhangers), introduceren we twee voorvoegsels: "echt" en "speelgoed".

<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>
Nu zal ons programma onderscheid kunnen maken tussen de verschillende entiteiten! Alles met het voorvoegsel speelgoed wordt behandeld als speelgoed :) We zijn echter nog niet klaar. Om voorvoegsels te gebruiken, moeten we ze allemaal registreren als een naamruimte. Eigenlijk is "registreren" een sterk woord :) We moeten gewoon een unieke naam voor elk van hen bedenken. Het is net als met klassen: een klasse heeft een korte naam ( Cat ) en een volledig gekwalificeerde naam die alle pakketten omvat ( zoo.animals.Cat). Een URI wordt meestal gebruikt om een ​​unieke naamruimtenaam te maken. Soms gebeurt dit via een internetadres, waar de functies van deze namespace beschreven staan. Maar het hoeft geen geldig internetadres te zijn. Heel vaak gebruiken projecten gewoon URI-achtige tekenreeksen die helpen bij het volgen van de naamruimtehiërarchie. Hier is een voorbeeld:

<?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>
Er is natuurlijk geen website op "http://testproject.developersgroup1.companyname/department2/namespaces/real" Maar deze string bevat wel nuttige informatie: de ontwikkelaars van Groep 1 in Afdeling 2 zijn verantwoordelijk voor het maken van de "echte" naamruimte . Als we nieuwe namen moeten introduceren of mogelijke conflicten moeten bespreken, weten we waar we moeten zijn. Soms gebruiken ontwikkelaars een echt beschrijvend webadres als een unieke naamruimtenaam. Dit kan bijvoorbeeld het geval zijn voor een groot bedrijf wiens project door miljoenen mensen over de hele wereld zal worden gebruikt. Maar dit wordt zeker niet altijd gedaan: Stack Overflow heeft een discussie over deze kwestie. Over het algemeen is er geen strikte vereiste om URI's als naamruimtenamen te gebruiken: u kunt ook gewoon willekeurige tekenreeksen gebruiken. Deze optie zou ook werken:

xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Dat gezegd hebbende, heeft het gebruik van een URI verschillende voordelen. Hier kunt u hier meer over lezen .

Basis XML-standaarden

XML-standaarden zijn een reeks extensies die extra functionaliteit toevoegen aan XML-bestanden. XML heeft veel standaarden, maar we kijken alleen naar de belangrijkste en ontdekken dat ze AJAX mogelijk maken, wat een van de bekendste XML-standaarden is. Hiermee kunt u de inhoud van een webpagina wijzigen zonder deze opnieuw te laden! Met XSLT kunt u XML-tekst naar andere indelingen converteren. U kunt bijvoorbeeld XSLT gebruiken om XML naar HTML te converteren! Zoals we al zeiden, is het doel van XML om gegevens te beschrijven, niet om ze weer te geven. Maar met XSLT kunnen we deze beperking omzeilen! Met XML DOM kunt u individuele elementen uit een XML-bestand ophalen, wijzigen, toevoegen of verwijderen. Hier is een klein voorbeeld van hoe dit werkt. We hebben een books.xml-bestand:

<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>
Het heeft twee boeken. Boeken hebben een <title>-element. Hier kunnen we JavaScript gebruiken om alle boektitels uit ons XML-bestand te halen en de eerste naar de console af te drukken:

<!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>
Met DTD ("documenttypedefinitie") kunt u een lijst met toegestane elementen voor een entiteit in een XML-bestand definiëren. Stel dat we werken aan een boekwinkelwebsite en dat alle ontwikkelingsteams het erover eens zijn dat alleen de titel, auteur en jaarkenmerken moeten worden gespecificeerd voor de boekelementen in de XML-bestanden. Maar hoe beschermen we onszelf tegen onzorgvuldigheid? Erg makkelijk!

<?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>
Hier hebben we een lijst met geldige attributen voor <boek> gedefinieerd. Probeer daar een nieuw element toe te voegen en je krijgt meteen een foutmelding!

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
Fout! "Element mainhero is hier niet toegestaan" Er zijn veel andere XML-standaarden. U kunt vertrouwd raken met elk van hen en proberen dieper in de code te graven. Hoe dan ook, als je informatie over XML nodig hebt, kun je daar bijna alles vinden :) En hiermee komt onze les tot een einde. Het is tijd om terug te gaan naar de taken! :) Tot de volgende keer!