John Squirrels
Ниво
San Francisco

XML в Java

Публикувано в групата
здрасти Днес ще представим друг формат на данни, наречен XML. Това е много важна тема. Когато работите върху реални Java applications, почти сигурно ще срещнете задачи, свързани с XML. В разработката на Java този формат се използва почти универсално (ще разберем защо по-долу), така че ви препоръчвам да не преглеждате повърхностно този урок, а по-скоро да придобиете задълбочено разбиране на всичко и също да изучавате допълнителна литература/връзки :) Това определено няма да е загуба на време. И така, нека започнем с лесните неща: „Howво“ и „защо“!

Какво е Java XML?

XML означава eXtensible Markup Language. Може би вече сте запознати с език за маркиране — чували ли сте за HTML, който се използва за създаване на уеб страници :) Какво е XML?  - 1HTML и XML дори имат подобен външен вид:
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 е език за описание на данни.

Защо се нуждаете от XML?

Първоначално XML е изобретен за по-удобно съхраняване и изпращане на данни, включително чрез Интернет. Той има няколко предимства, които ви помагат да постигнете това. Първо, лесно се чете Howто от човек, така и от компютър. Мисля, че можете лесно да разберете Howво описва този 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>
Компютърът също лесно разбира този формат. Второ, тъй като данните се съхраняват като обикновен текст, няма да има проблеми със съвместимостта, когато ги прехвърляме от един компютър на друг. Важно е да разберете, че XML не е изпълним code — това е език за описание на данни. След като опишете данни с помощта на XML, трябва да напишете code (например в Java), който може да изпраща/получава/обработва тези данни.

Как е структуриран XML?

Основният компонент са таговете: това са нещата в ъглови скоби:

<book>
</book>
Има отварящи тагове и затварящи тагове. Затварящият таг има допълнителен символ (" / "), Howто може да се види в примера по-горе. Всеки отварящ таг трябва да има затварящ таг. Те показват къде започва и завършва описанието на всеки елемент във file. Таговете могат да бъдат вложени! В нашия пример за книга тагът <book> има 3 вложени тагова: <title>, <author> и <year>. Това не е ограничено до едно ниво на влагане: вложените тагове могат да имат свои собствени вложени тагове и т.н. Тази структура се нарича дърво на тагове. Нека да разгледаме това дърво, използвайки примерен XML файл, който описва автокъща:

<?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>
Тук имаме етикет от най-високо ниво: <carstore>. Нарича се още коренен елемент. <carstore> има един дъщерен етикет: <car>. <car> от своя страна също има 3 дъщерни тагова: <model>, <year> и <price>. Всеки таг може да има атрибути, които съдържат допълнителна важна информация. В нашия пример тагът <model> има атрибут "lang", който показва езика, използван за записване на името на модела:

<model lang="en">Scania R 770</model>
Тук отбелязваме, че името е изписано на английски. Нашият етикет <price> има атрибут "currency".

<price currency="US dollar">150000.00</price>
Тук посочваме, че цената на автомобила е в щатски долари. Така XML има "самоописващ" синтаксис. Можете да добавите всяка информация, от която се нуждаете, за да опишете данните. Освен това в горната част на file можете да добавите ред, указващ XML versionта и codeирането, използвано за запис на данните. Това се нарича "пролог" и изглежда така:

<?xml version="1.0" encoding="UTF-8"?>
Използваме XML version 1.0 и UTF-8 codeиране. Това не е необходимо, но може да бъде полезно, ако например вашият файл използва текст на различни езици. Споменахме, че XML означава "разширяем език за маркиране", но Howво означава "разширяем"? Това означава, че е идеален за създаване на нови версии на вашите обекти и файлове. Да предположим например, че искаме да започнем да продаваме и мотоциклети в нашия автокъща! Имайки предвид това, трябва нашата програма да поддържа и двете версии на <carstore>: старата (без мотоциклети) и новата. Ето нашата стара 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>
А ето и новия разширен:

<?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>
Ето колко лесно и лесно е да добавим описание на мотоциклети към нашия файл :) Нещо повече, абсолютно не е необходимо да имаме същите дъщерни етикети за мотоциклети, Howто за автомобor. Моля, обърнете внимание, че мотоциклетите, за разлика от автомобorте, имат елемент <owner>. Това не пречи на компютъра (or човека) да чете данните.

Разлики между XML и HTML

Вече казахме, че XML и HTML са много сходни на външен вид. Това прави много важно да знаете How се различават. Първо, те се използват за различни цели. HTML е за маркиране на уеб страници. Например, докато създавате уебсайт, можете да използвате HTML, за да посочите: "Менюто трябва да е в горния десен ъгъл. Трябва да има такива и такива бутони". С други думи, работата на HTML е да показва данни. XML е за съхраняване и изпращане на информация във форма, удобна за хора и компютри. Този формат не съдържа индикация за това How трябва да се показват тези данни: това зависи от codeа на програмата, която ги чете. Второ, има голяма техническа разлика. HTML таговете са предварително дефинирани. С други думи, създаването на HTML заглавка (например голям надпис в горната част на pageта) използва само <h1></h1> тагове (<h2></h2> и <h3></h3> се използват за по-малки заглавки). Не можете да създавате HTML заглавки, като използвате други тагове. XML не използва предварително дефинирани тагове. Можете да дадете на таговете произволно име: <header>, <title>, <idontknow2121>.

Разрешаване на конфликти

Свободата, която предоставя XML, може да доведе до някои проблеми. Например един и същи обект (например автомобил) може да се използва от програма за различни цели. Например, имаме XML файл, който описва автомобor. Нашите програмисти обаче не постигнаха предварително споразумение помежду си. И сега, в допълнение към данните за истински коли, може да намерим данни за коли играчки в нашия XML! Освен това те имат едни и същи качества. Да кажем, че нашата програма чете такъв XML файл. Как да различим истинска кола от кола играчка?

<?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>
Тук ще ни помогнат префиксите и пространството от имена. За да различим автомобorте играчки от истинските в нашата програма (и всъщност всички играчки от истинските им двойници), въвеждаме два префикса: „истински“ и „играчка“.

<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>
Сега нашата програма ще може да прави разлика между различните обекти! Всичко, което има префикса toy, ще се третира като играчки :) Все още обаче не сме приключor. За да използваме префикси, трябва да регистрираме всеки от тях като пространство от имена. Всъщност "регистрирам" е силна дума :) Просто трябва да измислим уникално име за всеки от тях. Това е като с класовете: класът има кратко име ( Cat ) и напълно квалифицирано име, което включва всички пакети ( zoo.animals.Cat). URI обикновено се използва за създаване на уникално име на пространство от имена. Понякога това се прави с помощта на интернет address, където са описани функциите на това пространство от имена. Но не е задължително да е валиден интернет address. Много често проектите просто използват низове, подобни на URI, които помагат за проследяване на йерархията на пространството от имена. Ето един пример:

<?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>
Разбира се, няма уебсайт на "http://testproject.developersgroup1.companyname/department2/namespaces/real" Но този низ съдържа полезна информация: разработчиците от Група 1 в Отдел 2 са отговорни за създаването на "истинското" пространство от имена . Ако трябва да въведем нови имена or да обсъдим възможни конфликти, ще знаем към кого да се обърнем. Понякога разработчиците използват истински описателен уеб address като уникално име на пространство от имена. Например, това може да е случаят с голяма компания, чийто проект ще бъде използван от мorони хора по света. Но това със сигурност не винаги се прави: Stack Overflow има дискусия по този въпрос. По принцип няма стриктно изискване за използване на URI като имена на пространство от имена: можете също просто да използвате произволни низове. Тази опция също ще работи:

xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Въпреки това използването на URI има няколко предимства. Можете да прочетете повече за това тук .

Основни XML стандарти

XML стандартите са набор от разширения, които добавят допълнителна функционалност към XML файловете. XML има много стандарти, но ние ще разгледаме само най-важните и ще разберем, че те правят възможен AJAX, който е един от най-известните XML стандарти. Позволява ви да промените съдържанието на уеб page, без да я презареждате! XSLT ви позволява да конвертирате XML текст в други формати. Например, можете да използвате XSLT за конвертиране на XML в HTML! Както казахме, целта на XML е да описва данните, а не да ги показва. Но с XSLT можем да заобиколим това ограничение! XML DOM ви позволява да извличате, променяте, добавяте or изтривате отделни елементи от XML файл. Ето малък пример How работи това. Имаме файл 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>
Има две книги. Книгите имат елемент <title>. Тук можем да използваме JavaScript, за да получим всички заглавия на книги от нашия XML файл и да отпечатаме първото в конзолата:

<!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 ("дефиниция на тип document") ви позволява да дефинирате списък с разрешени елементи за обект в XML файл. Да предположим например, че работим върху уебсайт на книжарница и че всички екипи за разработка са съгласни, че само атрибутите за заглавие, автор и година трябва да бъдат посочени за елементите на книгата в XML файловете. Но How да се предпазим от невнимание? Много лесно!

<?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>
Тук сме дефинирали списък с валидни атрибути за <book>. Опитайте да добавите нов елемент там и веднага ще получите грешка!

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
грешка! „Елементът mainhero не е разрешен тук“ Има много други XML стандарти. Можете да се запознаете с всеки от тях и да се опитате да се задълбочите в codeа. Както и да е, ако имате нужда от информация за XML, можете да намерите почти всичко там :) И с това нашият урок приключва. Време е да се върнем към задачите! :) До следващия път!
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION