JavaRush /Java блог /Random UA /XML у Java: Що це?

XML у Java: Що це?

Стаття з групи Random UA
Вітання! Сьогодні ми познайомимося із ще одним форматом даних, який називається XML. Це дуже важлива тема. У роботі над справжніми Java-програмами ти майже напевно зіткнешся із завданнями, пов'язаними з XML. Цей формат використовується в 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 спочатку придумали для зручнішого зберігання та передачі даних, у тому числі через Інтернет. Він має ряд переваг, які дозволяють успішно справлятися з цим завданням. По-перше, він легко читається і людиною, і комп'ютером. Думаю, ти легко зрозумієш, що описує цей 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 - це не виконуваний код, а мова опису даних . Після того, як ти описав дані за допомогою XML, тобі потрібно написати код (наприклад, Java), який зможе ці дані відправити/прийняти/обробити.

Як влаштовано XML?

Його головна складова частина - теги: ось такі штуки в кутових дужках:
<book>
</book>
Теги бувають такими, що відкривають і закривають. У закриває є додатковий символ - " /", це видно на прикладі вище. Кожному тегу, що відкриває, повинен відповідати закриваючий. Вони показують, де починається і закінчується опис кожного елемента у файлі. Теги можуть бути вкладені! У нашому прикладі з книгою у тега <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> . Його ще називають "root" - кореневий тег. У <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 є «самоописуючий» синтакс . Ти можеш додати будь-яку потрібну інформацію для опису даних. Також до початку файлу можна додати рядок із зазначенням версії XML та кодування, в якому записані дані. Вона називається " prolog " і виглядає ось так:
<?xml version="1.0" encoding="UTF-8"?>
Ми застосовуємо XML версії 1.0 та кодування UTF-8. Це не обов'язково, але може стати в нагоді, якщо ти, наприклад, використовуєш у своєму файлі текст різними мовами. Ми згадали про те, що 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>
А ось нова, розширена:
<?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>
Ось так легко і просто ми додали опис мотоциклів до нашого файлу :) При цьому нам зовсім не потрібно задавати для мотоциклів ті ж дочірні теги, що і для машин. Зверніть увагу, що мотоцикли, на відміну від машин, мають елемент <owner> — власник. Це не завадить комп'ютеру (та й людині теж) прочитати дані.

Відмінності XML від HTML

Ми вже сказали, що XML та HTML зовні дуже схожі. Тому дуже важливо знати, чим вони відрізняються. По-перше, вони використовуються для різних цілей. HTML – для розмітки веб-сторінок. Наприклад, якщо потрібно створити веб-сайт, за допомогою HTML ти зможеш вказати: «Меню має бути у верхньому правому кутку. У ньому мають бути такі кнопки». Іншими словами, завдання HTML – відображення даних. XML - для зберігання та передачі інформаціїу зручному для людини та комп'ютера вигляді. Цей формат не містить жодних вказівок на те, як ці дані потрібно відображати: це залежить від коду самої програми. По-друге, вони мають основну технічну відмінність. Теги HTML є заздалегідь заданими (predefined). Іншими словами, для створення заголовка (наприклад, великого напису на початку сторінки) в HTML використовуються тільки теги <h1></h1> (для менших заголовків — <h2></h2>,<h3></h3>). Неможливо створити заголовки в HTML, використовуючи теги з іншими назвами. XML не використовує заздалегідь задані теги. Ти можеш давати тегам будь-які назви, які захочеш - <header>, <title>, <idontknow2121>.

Вирішення конфліктів

Свобода, яку надає XML, може призвести і до деяких проблем. Наприклад, та сама сутність (наприклад, машина) може використовуватися програмою з різною метою. Наприклад, у нас є XML-файл, в якому описані машини. Проте наші програмісти не домовабося заздалегідь між собою. І тепер, крім даних реальних автомобілів, у наші 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>
Тут нам допоможуть префікси та простори імен. Щоб відокремлювати в нашій програмі іграшкові машини від справжніх (та й взагалі – будь-які іграшкові речі від їхніх реальних прототипів), ми вводимо два префікси – “real” та “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>
Тепер наша програма зможе розрізнити сутність! Все, що має префікс toy, буде віднесено до іграшок :) Однак ми поки не закінчабо. Щоб використовувати префікси, нам треба зареєструвати кожен з них як простір імен (namespace). Ну, насправді «зареєструвати» — це голосно сказано :) Досить просто придумати унікальне ім'я для кожного з них. Це як із класами: клас має коротке ім'я ( Cat) і повне ім'я із зазначенням всіх пакетів ( zoo.animals.Cat) Для створення унікальних імен namespace зазвичай використовують URI. Іноді сюди підставляють адресау в Мережі, де докладно описано функції призначення цього простору імен. Але це не обов'язково має бути діюча інтернет-адресаа. Найчастіше на проектах використовують просто 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 Але є корисна інформація: за створення простору імен «real» відповідає група розробників «developersgroup1» з відділу «department2». Якщо потрібно буде внести нові імена або обговорити з ними можливі конфлікти, ми знаємо куди звернутися. Іноді як унікальне ім'я для namespace використовують реальну адресау в Мережі з описом цього простору імен. Наприклад, якщо це велика компанія, і її проект використовуватиметься мільйонами людей по всьому світу. Але це робиться далеко не завжди: на Stackoverflowє обговорення цього питання. В принципі, вимога використовувати URI як імена для namespace не є суворою: можна і просто рандомні рядки. Такий варіант також працюватиме:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Але використання URI має ряд переваг. Докладніше про це ти можеш почитати ось тут .

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

Стандарти XML - це набір розширень, які надають xml-файлум додаткові можливості. XML має дуже багато стандартів, але ми лише подивимося на найважливіші з них, і дізнаємося, що вони дозволяють робити AJAX — один із найвідоміших стандартів XML. Він дозволяє змінювати вміст веб-сторінки без її перезавантаження! Звучить круто? :) Можеш випробувати цю технологію особисто ось тут . XSLT — дозволяє перетворювати XML-текст на інші формати. Наприклад, використовуючи XSLT, ти можеш перетворити XML на HTML! Завдання XML, як ми вже казали, - опис даних, а не відображення. Але за допомогою XSLT ми можемо обійти це обмеження! Ось тутє «пісочниця» з працюючим прикладом, де ти можеш сам подивитися, як це працює :) XML DOM — дозволяє отримувати, змінювати, додавати або видаляти окремі елементи з XML-файлу. Ось невеликий приклад, як це працює. У нас є файл 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 type definition") - дозволяє визначити список дозволених елементів для якоїсь сутності в XML-файлі. Наприклад, ми працюємо над сайтом книгарні, і всі команди розробників домовабося, що для елемента book у XML-файлух мають бути вказані лише атрибути title, author та year. Але як захистити себе від неуважності? Дуже легко!
<?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>
Помилка! "Element mainhero is not allowed here" Є багато інших XML-стандартів. Ознайомитися з кожним з них і спробувати «поколупатися» в коді ти можеш на сайті WC3 (розділ «Important XML Standarts»). Та й взагалі, якщо тобі потрібна інформація щодо XML, там можна знайти практично все :) Ну а наша лекція на цьому добігла кінця. Настав час повернутися до завдань! :) До зустрічі!
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ