CodeGym/Java blog/Véletlen/XML Java nyelven
John Squirrels
Szint
San Francisco

XML Java nyelven

Megjelent a csoportban
Szia! Ma bemutatunk egy másik adatformátumot, az XML-t. Ez egy nagyon fontos téma. Amikor valódi Java-alkalmazásokon dolgozik, szinte biztosan találkozik XML-lel kapcsolatos feladatokkal. Java fejlesztésben ezt a formátumot szinte univerzálisan használják (lent megtudjuk, hogy miért), ezért azt javaslom, hogy ne felületesen nézze át ezt a leckét, hanem alaposan értsen meg mindent, és tanulmányozza át a további szakirodalmat/linkeket is :) Ez biztosan nem lesz időpocsékolás. Kezdjük tehát az egyszerű dolgokkal: a "mit" és a "miért"-vel!

Mi az a Java XML?

Az XML az eXtensible Markup Language rövidítése. Lehet, hogy már ismeri a jelölőnyelvet – hallott már a HTML-ről, amelyet weboldalak készítésére használnak? :) Mi az XML?  - 1A HTML és az XML megjelenése is hasonló:
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>
Más szóval, az XML az adatok leírására szolgáló nyelv.

Miért van szükség XML-re?

Az XML-t eredetileg az adatok kényelmesebb tárolására és küldésére találták ki, többek között az interneten keresztül is. Számos előnye van, amelyek segítenek ennek elérésében. Először is, könnyen olvasható ember és számítógép által is. Azt hiszem, könnyen megértheti, mit ír le ez az XML-fájl:
<?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>
A számítógép is könnyen megérti ezt a formátumot. Másodszor, mivel az adatokat egyszerű szövegként tároljuk, nem lesznek kompatibilitási problémák, amikor egyik számítógépről a másikra visszük át őket. Fontos megérteni, hogy az XML nem végrehajtható kód – ez egy adatleíró nyelv. Miután leírta az adatokat XML használatával, olyan kódot kell írnia (például Java nyelven), amely képes elküldeni/fogadni/feldolgozni ezeket az adatokat.

Hogyan épül fel az XML?

A fő összetevő a címkék: ezek a szögletes zárójelben lévő dolgok:
<book>
</book>
Vannak nyitó és záró címkék. A záró címkének van egy további szimbóluma (" / "), amint az a fenti példában látható. Minden nyitó címkének rendelkeznie kell egy záró címkével. Megmutatják, hogy a fájl egyes elemeinek leírása hol kezdődik és hol végződik. A címkék egymásba ágyazhatók! Könyvpéldánkban a <book> címkének 3 beágyazott címkéje van: <title>, <author> és <year>. Ez nem korlátozódik a beágyazás egy szintjére: a beágyazott címkéknek lehetnek saját beágyazott címkéi stb. Ezt a struktúrát címkefának nevezik. Nézzük meg ezt a fát egy minta XML-fájl segítségével, amely egy autókereskedést ír le:
<?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>
Itt van egy legfelső szintű címkénk: <carstore>. Gyökérelemnek is nevezik. <carstore> egy gyermekcímkével rendelkezik: <car>. Az <autó> pedig 3 gyermekcímkével is rendelkezik: <modell>, <year> és <price>. Minden címkének lehetnek attribútumai, amelyek további fontos információkat tartalmaznak. Példánkban a <model> címkének van egy "lang" attribútuma, amely a modellnév rögzítéséhez használt nyelvet jelzi:
<model lang="en">Scania R 770</model>
Itt jelezzük, hogy a név angolul van írva. A <price> címkénk rendelkezik egy "currency" attribútummal.
<price currency="US dollar">150000.00</price>
Itt jelezzük, hogy az autó ára amerikai dollárban van megadva. Így az XML-nek "önleíró" szintaxisa van. Az adatok leírásához bármilyen információt megadhat. Ezenkívül a fájl tetejére felvehet egy sort, amely jelzi az XML verziót és az adatok írásához használt kódolást. Ezt "prolognak" hívják, és így néz ki:
<?xml version="1.0" encoding="UTF-8"?>
XML 1.0-s verziót és UTF-8 kódolást használunk. Ez nem szükséges, de jól jöhet, ha például a fájl különböző nyelvű szöveget használ. Említettük, hogy az XML jelentése "bővíthető jelölőnyelv", de mit jelent az "extensible"? Ez azt jelenti, hogy tökéletes az objektumok és fájlok új verzióinak létrehozására. Tegyük fel például, hogy autókereskedésünkben is szeretnénk motorkerékpárokat árusítani! Ennek ellenére a programunknak támogatnia kell a <carstore> mindkét verzióját: a régit (motorkerékpárok nélkül) és az újat. Íme a régi verziónk:
<?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>
És itt az új, kibővített:
<?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>
Ilyen egyszerű és egyszerű a motorkerékpárok leírását felvenni a fájlunkba :) Sőt, egyáltalán nincs szükségünk arra, hogy a motorokhoz ugyanazok a gyerekcímkék legyenek, mint az autókhoz. Kérjük, vegye figyelembe, hogy a motorkerékpárok, az autókkal ellentétben, rendelkeznek egy <owner> elemmel. Ez nem akadályozza meg a számítógépet (vagy embert) az adatok beolvasásában.

Az XML és a HTML közötti különbségek

Korábban már említettük, hogy az XML és a HTML megjelenésében nagyon hasonló. Ezért nagyon fontos tudni, hogy miben különböznek egymástól. Először is, különböző célokra használják őket. A HTML weboldalak jelölésére szolgál. Például egy weboldal készítése közben HTML-ben megadhatja: "A menü legyen a jobb felső sarokban. Legyen benne ilyen és ilyen gombok". Más szóval, a HTML feladata az adatok megjelenítése. Az XML az információk tárolására és küldésére szolgál az emberek és a számítógépek számára kényelmes formában. Ez a formátum nem tartalmaz utalást arra vonatkozóan, hogyan kell ezeket az adatokat megjeleníteni: ez az azokat beolvasó program kódjától függ. Másodszor, van egy jelentős technikai különbség. A HTML címkék előre meghatározottak. Más szóval egy HTML-fejléc létrehozása (például egy nagy felirat az oldal tetején) csak <h1></h1> címkéket (<h2></h2> és <h3></h3> a kisebb fejlécekhez használják). Más címkék használatával nem hozhat létre HTML-fejlécet. Az XML nem használ előre meghatározott címkéket. A címkéknek tetszőleges nevet adhat: <header>, <title>, <idontknow2121>.

Konfliktusmegoldó

Az XML által biztosított szabadság bizonyos problémákhoz vezethet. Például egy és ugyanazt az entitást (például egy autót) egy program különböző célokra használhatja. Például van egy XML fájlunk, amely leírja az autókat. Programozóink azonban nem egyeztek meg egymással. És most a valódi autókra vonatkozó adatok mellett a játékautók adatait is találhatjuk az XML-ben! Ráadásul ugyanazokkal a tulajdonságokkal rendelkeznek. Tegyük fel, hogy a programunk egy ilyen XML fájlban olvas. Hogyan lehet megkülönböztetni az igazi autót a játékautótól?
<?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>
Itt az előtagok és a névtér segít nekünk. Annak érdekében, hogy a programunkban megkülönböztessük a játékautókat az igazitól (és valóban minden játékot valódi társaiktól), két előtagot vezetünk be: „igazi” és „játék”.
<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>
Most programunk képes lesz különbséget tenni a különböző entitások között! Minden, ami a játék előtaggal rendelkezik, játékként fog kezelni :) Ezzel azonban még nem végeztünk. Az előtagok használatához mindegyiket névtérként kell regisztrálnunk. Valójában a "regiszter" erős szó :) Egyszerűen mindegyiknek egyedi nevet kell kitalálnunk. Ez olyan, mint az osztályoknál: egy osztálynak van egy rövid neve ( Cat ) és egy teljes neve, amely tartalmazza az összes csomagot ( zoo.animals.Cat). Az URI-t általában egyedi névtérnév létrehozására használják. Néha ez egy internetcím használatával történik, ahol ennek a névtérnek a funkciói vannak leírva. De nem kell érvényes internetcímnek lennie. Nagyon gyakran a projektek egyszerűen URI-szerű karakterláncokat használnak, amelyek segítenek nyomon követni a névtér-hierarchiát. Íme egy példa:
<?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>
Természetesen nincs weboldal a "http://testproject.developersgroup1.companyname/department2/namespaces/real" címen, de ez a karakterlánc hasznos információkat tartalmaz: a 2. osztály 1. csoportjának fejlesztői felelősek az "igazi" névtér létrehozásáért. . Ha új neveket kell bevezetnünk, vagy meg kell beszélnünk az esetleges konfliktusokat, tudni fogjuk, hova forduljunk. Néha a fejlesztők valódi leíró webcímet használnak egyedi névtérnévként. Például ez lehet a helyzet egy nagyvállalat esetében, amelynek projektjét emberek milliói fogják használni szerte a világon. De ez természetesen nem mindig történik meg: a Stack Overflow vitát folytat erről a kérdésről. Általánosságban elmondható, hogy nincs szigorú követelmény az URI-k névtérnévként való használatára: egyszerűen véletlenszerű karakterláncokat is használhat. Ez a lehetőség is működne:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Ennek ellenére az URI használatának számos előnye van. Erről bővebben itt olvashat .

Alapvető XML szabványok

Az XML szabványok olyan kiterjesztések készlete, amelyek extra funkciókat adnak az XML-fájlokhoz. Az XML-nek sok szabványa van, de csak a legfontosabbakat nézzük meg, és megtudjuk, hogy ezek lehetővé teszik az AJAX-ot, amely az egyik leghíresebb XML szabvány. Lehetővé teszi egy weboldal tartalmának megváltoztatását anélkül, hogy újra kellene töltenie! Az XSLT lehetővé teszi az XML szövegek más formátumokká alakítását. Például az XSLT segítségével XML-t HTML-vé konvertálhat! Mint mondtuk, az XML célja az adatok leírása, nem pedig a megjelenítése. Az XSLT-vel azonban megkerülhetjük ezt a korlátozást! Az XML DOM lehetővé teszi az egyes elemek lekérését, módosítását, hozzáadását vagy törlését egy XML-fájlból. Íme egy kis példa, hogyan működik ez. Van egy books.xml fájlunk:
<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>
Két könyve van. A könyveknek van egy <title> eleme. Itt JavaScript segítségével lekérhetjük az összes könyvcímet az XML-fájlunkból, és kinyomtathatjuk az elsőt a konzolra:
<!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>
A DTD ("dokumentumtípus-definíció") lehetővé teszi egy entitás engedélyezett elemeinek listájának meghatározását egy XML-fájlban. Tegyük fel például, hogy egy könyvesbolt webhelyén dolgozunk, és minden fejlesztőcsapat egyetért abban, hogy az XML-fájlok könyvelemeihez csak a cím, a szerző és az év attribútumait kell megadni. De hogyan védjük meg magunkat a figyelmetlenségtől? Nagyon könnyű!
<?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>
Itt definiáltuk a <book> érvényes attribútumainak listáját. Próbáljon meg új elemet hozzáadni, és azonnal hibaüzenetet kap!
<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
Hiba! "Az elem főhőse itt nem engedélyezett" Sok más XML szabvány is létezik. Mindegyikkel megismerkedhet, és megpróbálhat mélyebbre ásni a kódot. Amúgy ha XML-ről információra van szükséged, ott szinte mindent megtalálsz :) És ezzel a leckénk is véget ér. Ideje visszatérni a feladatokhoz! :) A következő alkalomig!
Hozzászólások
  • Népszerű
  • Új
  • Régi
Hozzászólás írásához be kell jelentkeznie
Ennek az oldalnak még nincsenek megjegyzései