Hej! Idag kommer vi att introducera ett annat dataformat som heter XML. Detta är ett mycket viktigt ämne. När du arbetar med riktiga Java-applikationer kommer du nästan säkert att stöta på XML-relaterade uppgifter. Inom Java-utveckling används detta format nästan universellt (vi kommer att ta reda på varför nedan), så jag rekommenderar att du inte går igenom den här lektionen ytligt, utan hellre skaffar dig en grundlig förståelse för allt och även studerar ytterligare litteratur/länkar :) kommer definitivt inte att vara slöseri med tid. Så låt oss börja med de enkla sakerna: "vad" och "varför"!

Vad är Java XML?

XML står för eXtensible Markup Language. Du kanske redan är bekant med ett märkningsspråk — har du hört talas om HTML, som används för att skapa webbsidor :) Vad är XML?  - 1HTML och XML har till och med ett liknande utseende:
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>
XML är med andra ord ett språk för att beskriva data.

Varför behöver du XML?

XML uppfanns ursprungligen för att mer bekvämt lagra och skicka data, inklusive via Internet. Det har flera fördelar som hjälper dig att uppnå detta. För det första är det lätt att läsa av både en människa och en dator. Jag tror att du lätt kan förstå vad den här XML-filen beskriver:

<?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>
En dator förstår också lätt detta format. För det andra, eftersom data lagras som vanlig text, kommer det inte att uppstå några kompatibilitetsproblem när vi överför dem från en dator till en annan. Det är viktigt att förstå att XML inte är körbar kod – det är ett databeskrivningsspråk. När du har beskrivit data med XML måste du skriva kod (till exempel i Java) som kan skicka/ta emot/bearbeta dessa data.

Hur är XML uppbyggt?

Huvudkomponenten är taggar: det här är sakerna inom vinkelparenteser:

<book>
</book>
Det finns öppnande taggar och stängningstaggar. Den avslutande taggen har en extra symbol (" / "), som kan ses i exemplet ovan. Varje öppningsbricka måste ha en stängningsbricka. De visar var beskrivningen av varje element i filen börjar och slutar. Taggar kan kapslas! I vårt bokexempel har <book>-taggen 3 kapslade taggar: <title>, <author> och <year>. Detta är inte begränsat till en nivå av kapsling: kapslade taggar kan ha sina egna kapslade taggar, etc. Denna struktur kallas ett taggträd. Låt oss titta på det här trädet med ett exempel på en XML-fil som beskriver en bilhandlare:

<?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>
Här har vi en tagg på toppnivå: <carstore>. Det kallas också ett rotelement. <carstore> har en underordnad tagg: <car>. <car> har i sin tur också 3 underordnade taggar: <model>, <year> och <price>. Varje tagg kan ha attribut som innehåller ytterligare viktig information. I vårt exempel har <model>-taggen ett "lang"-attribut, som indikerar språket som används för att registrera modellnamnet:

<model lang="en">Scania R 770</model>
Här anger vi att namnet är skrivet på engelska. Vår <price>-tagg har ett "valuta"-attribut.

<price currency="US dollar">150000.00</price>
Här anger vi att bilens pris anges i amerikanska dollar. Således har XML en "självbeskrivande" syntax. Du kan lägga till all information du behöver för att beskriva uppgifterna. Dessutom kan du överst i filen lägga till en rad som anger XML-versionen och kodningen som används för att skriva data. Detta kallas "prolog" och det ser ut så här:

<?xml version="1.0" encoding="UTF-8"?>
Vi använder XML version 1.0 och UTF-8-kodning. Detta är inte nödvändigt, men det kan vara praktiskt om din fil till exempel använder text på olika språk. Vi nämnde att XML betyder "eXtensible Markup Language", men vad betyder "extensible"? Det betyder att den är perfekt för att skapa nya versioner av dina objekt och filer. Anta till exempel att vi också vill börja sälja motorcyklar på vår bilhandlare! Som sagt, vi behöver våra programbehov för att stödja båda versionerna av <carstore>: den gamla (utan motorcyklar) och den nya. Här är vår gamla version:

<?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>
Och här är den nya utökade:

<?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>
Så enkelt och enkelt är det att lägga till en beskrivning av motorcyklar i vår fil :) Dessutom behöver vi absolut inte ha samma barnetiketter för motorcyklar som för bilar. Observera att motorcyklar, till skillnad från bilar, har ett <owner>-element. Detta hindrar inte datorn (eller människan) från att läsa data.

Skillnader mellan XML och HTML

Vi har redan sagt att XML och HTML är väldigt lika till utseendet. Det gör det mycket viktigt att veta hur de skiljer sig åt. För det första används de för olika ändamål. HTML är till för att markera webbsidor. Till exempel, när du skapar en webbplats, kan du använda HTML för att specificera: "Menyn ska finnas i det övre högra hörnet. Den ska ha sådana och sådana knappar". HTMLs uppgift är med andra ord att visa data. XML är till för att lagra och skicka information i en form som är lämplig för människor och datorer. Det här formatet innehåller ingen indikation på hur denna data ska visas: det beror på koden för programmet som läser den. För det andra finns det en stor teknisk skillnad. HTML-taggar är fördefinierade. Med andra ord, skapa en HTML-rubrik (till exempel en stor bildtext högst upp på sidan) använder bara <h1></h1> taggar (<h2></h2> och <h3></h3> används för mindre rubriker). Du kan inte skapa HTML-rubriker med andra taggar. XML använder inte fördefinierade taggar. Du kan ge taggar vilket namn du vill: <header>, <title>, <idontknow2121>.

Konfliktlösning

Den frihet som XML ger kan leda till vissa problem. Till exempel kan en och samma enhet (till exempel en bil) användas av ett program för olika ändamål. Vi har till exempel en XML-fil som beskriver bilar. Våra programmerare nådde dock inte en förhandsöverenskommelse sinsemellan. Och nu kan vi, förutom data om riktiga bilar, hitta data om leksaksbilar i vår XML! Dessutom har de samma egenskaper. Låt oss säga att vårt program läser in en sådan XML-fil. Hur skiljer vi en riktig bil från en leksaksbil?

<?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>
Här hjälper prefix och namnutrymme oss. För att skilja leksaksbilar från riktiga i vårt program (och faktiskt alla leksaker från deras riktiga motsvarigheter), introducerar vi två prefix: "riktiga" och "leksak".

<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 kommer vårt program att kunna skilja mellan de olika enheterna! Allt som har leksaksprefixet kommer att behandlas som leksaker :) Vi är dock inte klara än. För att använda prefix måste vi registrera vart och ett av dem som ett namnområde. Egentligen är "registrera" ett starkt ord :) Vi behöver helt enkelt komma på ett unikt namn för var och en av dem. Det är som med klasser: en klass har ett kort namn ( Cat ) och ett fullt kvalificerat namn som inkluderar alla paket ( zoo.animals.Cat). En URI används vanligtvis för att skapa ett unikt namnområdesnamn. Ibland görs detta med hjälp av en internetadress, där funktionerna i detta namnområde beskrivs. Men det behöver inte vara en giltig internetadress. Mycket ofta använder projekt helt enkelt URI-liknande strängar som hjälper till att spåra namnutrymmeshierarkin. Här är ett exempel:

<?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>
Naturligtvis finns det ingen webbplats på "http://testproject.developersgroup1.companyname/department2/namespaces/real" Men den här strängen innehåller användbar information: utvecklarna av grupp 1 i avdelning 2 är ansvariga för att skapa den "riktiga" namnrymden . Om vi ​​behöver införa nya namn eller diskutera möjliga konflikter vet vi vart vi ska vända oss. Ibland använder utvecklare en riktig beskrivande webbadress som ett unikt namnområdesnamn. Det kan till exempel vara fallet för ett stort företag vars projekt kommer att användas av miljontals människor runt om i världen. Men detta görs verkligen inte alltid: Stack Overflow har en diskussion om denna fråga. I allmänhet finns det inga strikta krav på att använda URI:er som namnområdesnamn: du kan också helt enkelt använda slumpmässiga strängar. Det här alternativet skulle också fungera:

xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Som sagt, att använda en URI har flera fördelar. Du kan läsa mer om detta här .

Grundläggande XML-standarder

XML-standarder är en uppsättning tillägg som lägger till extra funktionalitet till XML-filer. XML har många standarder, men vi ska bara titta på de viktigaste och ta reda på att de gör AJAX möjligt, vilket är en av de mest kända XML-standarderna. Det låter dig ändra innehållet på en webbsida utan att ladda om den! XSLT låter dig konvertera XML-text till andra format. Du kan till exempel använda XSLT för att konvertera XML till HTML! Som vi har sagt är syftet med XML att beskriva data, inte att visa det. Men med XSLT kan vi komma runt denna begränsning! XML DOM låter dig hämta, ändra, lägga till eller ta bort enskilda element från en XML-fil. Här är ett litet exempel på hur detta fungerar. Vi har en books.xml-fil:

<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>
Den har två böcker. Böcker har ett <title>-element. Här kan vi använda JavaScript för att hämta alla boktitlar från vår XML-fil och skriva ut den första till konsolen:

<!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 ("dokumenttypsdefinition") låter dig definiera en lista över tillåtna element för en entitet i en XML-fil. Anta till exempel att vi arbetar med en bokhandelswebbplats och att alla utvecklingsteam är överens om att endast attributen titel, författare och år ska anges för bokelementen i XML-filerna. Men hur skyddar vi oss från slarv? Väldigt lätt!

<?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>
Här har vi definierat en lista med giltiga attribut för <bok>. Försök att lägga till ett nytt element där så får du omedelbart ett felmeddelande!

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
Fel! "Element mainhero är inte tillåtet här" Det finns många andra XML-standarder. Du kan bekanta dig med var och en av dem och försöka gräva djupare i koden. Hur som helst, om du behöver information om XML kan du hitta nästan allt där :) Och med detta tar vår lektion ett slut. Det är dags att återgå till uppgifterna! :) Tills nästa gång!