Autor
John Selawsky
Senior Java Developer and Tutor at LearningTree

XML w Javie

Opublikowano w grupie Random-PL
Cześć! Dzisiaj przedstawimy kolejny format danych o nazwie XML. To bardzo ważny temat. Pracując nad prawdziwymi aplikacjami Java, prawie na pewno napotkasz zadania związane z XML. W programowaniu w Javie ten format jest używany prawie powszechnie (poniżej dowiemy się dlaczego), więc radzę nie przeglądać tej lekcji powierzchownie, ale raczej dogłębnie wszystko zrozumieć, a także przestudiować dodatkową literaturę/linki :) To z pewnością nie będzie stratą czasu. Zacznijmy więc od rzeczy łatwych: „co” i „dlaczego”!

Co to jest Java XML?

XML oznacza eXtensible Markup Language. Być może znasz już język znaczników — słyszałeś o HTML, który jest używany do tworzenia stron internetowych :) Co to jest XML?  - 1HTML i XML mają nawet podobny wygląd:
HTML 1
<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>
Innymi słowy, XML to język opisu danych.

Dlaczego potrzebujesz XML-a?

XML został pierwotnie wymyślony w celu wygodniejszego przechowywania i przesyłania danych, w tym przez Internet. Ma kilka zalet, które pomogą Ci to osiągnąć. Po pierwsze, jest łatwy do odczytania zarówno przez człowieka, jak i komputer. Myślę, że możesz łatwo zrozumieć, co opisuje ten plik 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>
Komputer również z łatwością rozumie ten format. Po drugie, ponieważ dane są przechowywane jako zwykły tekst, nie będzie problemów ze zgodnością podczas przesyłania ich z jednego komputera na drugi. Ważne jest, aby zrozumieć, że XML nie jest kodem wykonywalnym — jest językiem opisu danych. Po opisaniu danych za pomocą XML musisz napisać kod (na przykład w Javie), który może wysyłać/odbierać/przetwarzać te dane.

Jak zbudowany jest XML?

Głównym składnikiem są tagi: to są rzeczy w nawiasach ostrych:
<book>
</book>
Istnieją tagi otwierające i zamykające. Znacznik zamykający ma dodatkowy symbol (" / "), jak widać na powyższym przykładzie. Każdy tag otwierający musi mieć tag zamykający. Pokazują, gdzie zaczyna się i kończy opis każdego elementu w pliku. Tagi można zagnieżdżać! W naszym przykładzie książki tag <book> zawiera 3 zagnieżdżone tagi: <tytuł>, <autor> i <rok>. Nie jest to ograniczone do jednego poziomu zagnieżdżenia: zagnieżdżone znaczniki mogą mieć własne zagnieżdżone znaczniki itp. Taka struktura nazywana jest drzewem znaczników. Spójrzmy na to drzewo, używając przykładowego pliku XML opisującego salon samochodowy:
<?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>
Tutaj mamy znacznik najwyższego poziomu: <carstore>. Jest również nazywany elementem głównym. <carstore> ma jeden tag podrzędny: <car>. <samochód> z kolei ma również 3 tagi potomne: <model>, <rok> i <cena>. Każdy tag może mieć atrybuty, które zawierają dodatkowe ważne informacje. W naszym przykładzie tag <model> ma atrybut „lang”, który wskazuje język użyty do zapisania nazwy modelu:
<model lang="en">Scania R 770</model>
Tutaj wskazujemy, że nazwa jest napisana w języku angielskim. Nasz tag <price> ma atrybut „currency”.
<price currency="US dollar">150000.00</price>
Tutaj zaznaczamy, że cena samochodu podana jest w dolarach amerykańskich. Zatem XML ma „samoopisującą się” składnię. Możesz dodać dowolne informacje potrzebne do opisania danych. Dodatkowo na górze pliku można dodać linię wskazującą wersję XML oraz kodowanie użyte do zapisu danych. Nazywa się to „prologiem” i wygląda tak:
<?xml version="1.0" encoding="UTF-8"?>
Używamy XML w wersji 1.0 i kodowania UTF-8. Nie jest to konieczne, ale może się przydać, jeśli na przykład plik zawiera tekst w różnych językach. Wspomnieliśmy, że XML oznacza „eXtensible Markup Language”, ale co oznacza „extensible”? Oznacza to, że doskonale nadaje się do tworzenia nowych wersji obiektów i plików. Załóżmy na przykład, że chcemy również rozpocząć sprzedaż motocykli w naszym salonie samochodowym! To powiedziawszy, potrzebujemy, aby nasz program obsługiwał obie wersje <carstore>: starą (bez motocykli) i nową. Oto nasza stara wersja:
<?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>
A oto nowy, rozszerzony:
<?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>
Tak łatwe i proste jest dodanie opisu motocykli do naszego pliku :) Co więcej, absolutnie nie musimy mieć takich samych tagów potomnych dla motocykli jak dla samochodów. Należy pamiętać, że motocykle, w przeciwieństwie do samochodów, mają element <owner>. Nie przeszkadza to komputerowi (lub człowiekowi) w odczytywaniu danych.

Różnice między XML i HTML

Powiedzieliśmy już, że XML i HTML mają bardzo podobny wygląd. To sprawia, że ​​bardzo ważne jest, aby wiedzieć, czym się różnią. Po pierwsze, są one wykorzystywane do różnych celów. HTML służy do oznaczania stron internetowych. Na przykład podczas tworzenia strony internetowej możesz użyć HTML, aby określić: „Menu powinno znajdować się w prawym górnym rogu. Powinno mieć takie a takie przyciski”. Innymi słowy, zadaniem HTML jest wyświetlanie danych. XML służy do przechowywania i przesyłania informacji w formie wygodnej dla ludzi i komputerów. Ten format nie zawiera żadnych wskazówek, jak te dane powinny być wyświetlane: zależy to od kodu programu, który je odczytuje. Po drugie, istnieje zasadnicza różnica techniczna. Tagi HTML są predefiniowane. Innymi słowy, tworzenie nagłówka HTML (na przykład dużego podpisu u góry strony) wykorzystuje tylko <h1></h1> tagi (<h2></h2> i <h3></h3> są używane dla mniejszych nagłówków). Nie możesz tworzyć nagłówków HTML przy użyciu innych tagów. XML nie używa predefiniowanych tagów. Możesz nadać tagom dowolną nazwę: <header>, <title>, <idontknow2121>.

Rozwiązanie konfliktu

Swoboda, jaką zapewnia XML, może prowadzić do pewnych problemów. Na przykład ten sam obiekt (na przykład samochód) może być używany przez program do różnych celów. Na przykład mamy plik XML opisujący samochody. Jednak nasi programiści nie doszli do porozumienia między sobą. A teraz, oprócz danych o prawdziwych samochodach, w naszym XML-u możemy znaleźć dane o samochodzikach! Co więcej, mają te same cechy. Powiedzmy, że nasz program wczytuje taki plik XML. Jak odróżnić prawdziwy samochód od samochodzika?
<?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>
Tutaj pomogą nam prefiksy i przestrzeń nazw. W celu odróżnienia w naszym programie samochodzików od prawdziwych (a właściwie wszelkich zabawek od ich prawdziwych odpowiedników), wprowadzamy dwa przedrostki: „prawdziwy” i „zabawka”.
<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>
Teraz nasz program będzie w stanie rozróżnić różne podmioty! Wszystko, co ma prefiks zabawki, będzie traktowane jako zabawki :) Jednak jeszcze nie skończyliśmy. Aby używać prefiksów, musimy zarejestrować każdy z nich jako przestrzeń nazw. Właściwie „rejestracja” to mocne słowo :) Po prostu musimy wymyślić unikalną nazwę dla każdego z nich. To tak jak z klasami: klasa ma krótką nazwę ( Cat ) i w pełni kwalifikowaną nazwę obejmującą wszystkie pakiety ( zoo.animals. Cat). Identyfikator URI jest zwykle używany do tworzenia unikalnej nazwy przestrzeni nazw. Czasami odbywa się to za pomocą adresu internetowego, w którym opisane są funkcje tej przestrzeni nazw. Ale nie musi to być prawidłowy adres internetowy. Bardzo często projekty po prostu używają ciągów podobnych do identyfikatorów URI, które pomagają śledzić hierarchię przestrzeni nazw. Oto przykład:
<?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>
Oczywiście nie ma strony internetowej pod adresem „http://testproject.developersgroup1.companyname/department2/namespaces/real” Ale ten ciąg zawiera przydatne informacje: programiści Grupy 1 w Dziale 2 są odpowiedzialni za stworzenie „prawdziwej” przestrzeni nazw . Jeśli będziemy musieli wprowadzić nowe nazwiska lub przedyskutować możliwe konflikty, będziemy wiedzieć, gdzie się zwrócić. Czasami programiści używają prawdziwego opisowego adresu internetowego jako unikalnej nazwy przestrzeni nazw. Może tak być na przykład w przypadku dużej firmy, z której projektu będą korzystać miliony ludzi na całym świecie. Ale z pewnością nie zawsze się to robi: Stack Overflow ma dyskusję na ten temat. Ogólnie rzecz biorąc, nie ma ścisłego wymogu używania identyfikatorów URI jako nazw przestrzeni nazw: można również po prostu użyć losowych ciągów znaków. Ta opcja również zadziała:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
To powiedziawszy, używanie URI ma kilka zalet. Możesz przeczytać więcej na ten temat tutaj .

Podstawowe standardy XML

Standardy XML to zestaw rozszerzeń, które dodają dodatkowe funkcje do plików XML. XML ma wiele standardów, ale przyjrzymy się tylko najważniejszym z nich i przekonamy się, że dzięki nim możliwy jest AJAX, który jest jednym z najbardziej znanych standardów XML. Pozwala zmieniać zawartość strony internetowej bez jej przeładowywania! XSLT umożliwia konwersję tekstu XML do innych formatów. Na przykład możesz użyć XSLT do konwersji XML na HTML! Jak już powiedzieliśmy, celem XML jest opisywanie danych, a nie ich wyświetlanie. Ale dzięki XSLT możemy obejść to ograniczenie! XML DOM umożliwia pobieranie, modyfikowanie, dodawanie lub usuwanie poszczególnych elementów z pliku XML. Oto mały przykład tego, jak to działa. Mamy plik 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>
Ma dwie książki. Książki mają element <title>. Tutaj możemy użyć JavaScript, aby pobrać wszystkie tytuły książek z naszego pliku XML i wydrukować pierwszy na konsoli:
<!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 („definicja typu dokumentu”) umożliwia zdefiniowanie listy dozwolonych elementów dla encji w pliku XML. Załóżmy na przykład, że pracujemy nad witryną internetową księgarni i wszystkie zespoły programistyczne zgadzają się, że dla elementów książki w plikach XML należy określić tylko atrybuty tytułu, autora i roku. Jak jednak uchronić się przed nieuwagą? Bardzo łatwe!
<?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>
Tutaj zdefiniowaliśmy listę prawidłowych atrybutów dla <książka>. Spróbuj dodać tam nowy element, a natychmiast pojawi się błąd!
<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
Błąd! „Element mainhero nie jest tutaj dozwolony” Istnieje wiele innych standardów XML. Możesz zapoznać się z każdym z nich i spróbować zagłębić się w kod. W każdym razie, jeśli potrzebujesz informacji o XML, znajdziesz tam prawie wszystko :) I na tym nasza lekcja dobiega końca. Czas wrócić do zadań! :) Do następnego razu!
Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy