JavaRush /Blog Java /Random-PL /XML w Javie: co to jest?

XML w Javie: co to jest?

Opublikowano w grupie Random-PL
Cześć! Dziś zapoznamy się z innym formatem danych zwanym XML. To bardzo ważny temat. Pracując nad prawdziwymi aplikacjami Java, prawie na pewno napotkasz problemy związane z XML. Ten format jest używany niemal wszędzie w programowaniu w Javie (dowiemy się dlaczego dokładnie poniżej), dlatego polecam czytać wykład nie „po przekątnej”, ale wszystko dokładnie zrozumieć i jednocześnie przestudiować dodatkową literaturę/linki :) To czas na pewno nie będzie stracony. Zacznijmy więc od prostych – „co” i „dlaczego”!

Co to jest XML?

XML oznacza eXtensible Markup Language. Być może znasz już jeden z języków znaczników: słyszałeś o HTML, który służy do tworzenia stron internetowych :) Co to jest XML - 1HTML i XML są nawet podobne pod względem wyglądu:
HTML1
<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 jest językiem opisu danych.

Dlaczego potrzebny jest XML?

XML został pierwotnie wynaleziony w celu wygodniejszego przechowywania i przesyłania danych, w tym przez Internet. Posiada szereg zalet, które pozwalają mu skutecznie poradzić sobie z tym zadaniem. Po pierwsze, jest łatwy do odczytania zarówno przez ludzi, jak i komputery. 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 w prostym formacie tekstowym, nie będzie problemów z kompatybilnością podczas przesyłania ich z jednego komputera na drugi. Ważne jest, aby zrozumieć, że XML nie jest kodem wykonywalnym, ale językiem opisu danych . Po opisaniu danych za pomocą XML musisz napisać kod (na przykład w Javie), który będzie mógł wysyłać/odbierać/przetwarzać te dane.

Jak działa XML?

Jego głównym składnikiem są tagi: to są rzeczy w nawiasach ostrych:
<book>
</book>
Istnieją znaczniki otwierające i zamykające. Zamykający posiada dodatkowy symbol – „ /”, co widać na powyższym przykładzie. Każdy znacznik otwierający musi mieć odpowiedni znacznik 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> ma 3 podtagi - <title> , <author> i <year> . Nie jest to ograniczone do jednego poziomu: podtagi mogą mieć własne podtagi itp. Ten projekt nazywa się drzewem znaczników. Przyjrzyjmy się drzewu na przykładzie pliku XML z opisem salonu samochodowego:
<?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 tag najwyższego poziomu - <carstore> . Nazywa się go również „rootem” - tagiem root. <carstore> ma jeden tag podrzędny, <car>. Z kolei <car> ma również 3 własne znaczniki podrzędne - <model>, <rok> i <cena>. Każdy tag może posiadać atrybuty - dodatkowe ważne informacje. W naszym przykładzie znacznik <model> posiada atrybut „lang” – język, w którym napisana jest nazwa modelu:
<model lang="en">Scania R 770</model>
W ten sposób możemy wskazać, że tytuł jest napisany w języku angielskim. Nasz tag <price> ma atrybut „waluta”.
<price currency="US dollar">150000.00</price>
W ten sposób możemy wskazać, że cena samochodu jest wyrażona w dolarach amerykańskich. Zatem XML ma „samoopisującą się” składnię . Możesz dodać dowolne informacje potrzebne do opisania danych. Możesz także dodać na początku pliku linię wskazującą wersję XML i kodowanie, w jakim zapisane są dane. Nazywa się to „ prolog ” i wygląda tak:
<?xml version="1.0" encoding="UTF-8"?>
Używamy kodowania XML w wersji 1.0 i UTF-8. Nie jest to konieczne, ale może się przydać, jeśli na przykład w swoim pliku użyjesz tekstu w różnych językach. Wspomnieliśmy, że XML oznacza „rozszerzalny język znaczników”, ale co oznacza „rozszerzalny”? Oznacza to, że doskonale nadaje się do tworzenia nowych wersji Twoich obiektów i plików. Na przykład chcemy, aby nasz salon samochodowy zaczął sprzedawać także motocykle! Jednocześnie w programie musimy obsługiwać obie wersje <carstore> - zarówno starą (bez motocykli), jak 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 łatwo i prosto dodaliśmy opis motocykli do naszego pliku :) Jednocześnie absolutnie nie musimy ustawiać tych samych tagów podrzędnych dla motocykli, co dla samochodów. Należy pamiętać, że motocykle w odróżnieniu od samochodów posiadają element <właściciel> - właściciela. Nie uniemożliwi to komputerowi (lub osobie) odczytania danych.

Różnice pomiędzy XML i HTML

Powiedzieliśmy już, że XML i HTML mają bardzo podobny wygląd. Dlatego bardzo ważne jest, aby wiedzieć, czym się różnią. Po pierwsze, są one wykorzystywane do różnych celów. HTML - do oznaczania stron internetowych. Na przykład, jeśli chcesz stworzyć stronę internetową, używając HTML, możesz określić: „Menu powinno znajdować się w prawym górnym rogu. Powinien mieć takie i takie przyciski.” Innymi słowy, celem HTML jest wyświetlanie danych. XML - do przechowywania i przesyłania informacji w formie wygodnej dla człowieka i komputera. Format ten nie zawiera żadnych instrukcji dotyczących sposobu wyświetlania tych danych: zależy to od kodu samego programu. Po drugie, mają główną różnicę techniczną. Tagi HTML są predefiniowane. Innymi słowy, aby utworzyć nagłówek (np. duży napis na początku strony), w HTML stosuje się wyłącznie znaczniki <h1></h1> (dla mniejszych nagłówków - <h2></h2>, < h3></h3>). Nie będzie można tworzyć nagłówków w formacie HTML przy użyciu tagów o różnych tytułach. XML nie używa predefiniowanych tagów. Możesz nadać tagom dowolne nazwy - <header>, <title>, <idontknow2121>.

Rozwiązanie konfliktu

Swoboda, jaką zapewnia XML, może również 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 maszyny. Jednak nasi programiści nie zgodzili się między sobą z góry. A teraz oprócz danych z prawdziwych samochodów, nasz xml zawiera także dane z modeli zabawek! Co więcej, mają te same cechy. Nasz program otrzymuje następujący plik XML. Jak odróżnić prawdziwy samochód od modelu zabawki?
<?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>
Pomogą nam w tym przedrostki i przestrzenie nazw. Aby oddzielić w naszym programie samochodziki od prawdziwych (i w ogóle wszelkie zabawki od ich prawdziwych prototypó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 potrafił rozróżniać byty! Wszystko, co ma przedrostek „zabawka”, będzie klasyfikowane jako zabawki :) Jednak to jeszcze nie koniec. Aby używać przedrostków, musimy zarejestrować każdy z nich jako przestrzeń nazw. No cóż, faktycznie „zarejestrować się” to mocne słowo :) Wystarczy wymyślić dla każdego z nich unikalną nazwę. To tak jak z klasami: klasa ma krótką nazwę ( Cat) i pełną nazwę zawierającą wszystkie pakiety ( zoo.animals.Cat) . Aby utworzyć unikalne przestrzenie nazw, zwykle używany jest identyfikator URI . Czasami podstawiony jest tutaj adres internetowy, gdzie szczegółowo opisano funkcje i przeznaczenie tej przestrzeni nazw. Nie musi to być jednak prawidłowy adres internetowy. Bardzo często projekty używają po prostu ciągów znaków przypominających 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 w Internecie pod adresem http://testproject.developersgroup1.companyname/department2/namespaces/real Ale jest przydatna informacja: za tworzenie odpowiedzialna jest grupa programistów „developersgroup1” z działu „department2” „prawdziwą” przestrzeń nazw. Jeśli chcesz dodać nowe nazwiska lub omówić z nimi możliwe konflikty, wiemy, gdzie się zwrócić. Czasami prawdziwy adres internetowy z opisem tej przestrzeni nazw jest używany jako unikalna nazwa przestrzeni nazw. Przykładowo, jeśli jest to duża firma i z jej projektu będą korzystać miliony ludzi na całym świecie. Ale nie zawsze tak się dzieje: na Stackoverflow toczy się dyskusja na ten temat . W zasadzie wymóg używania identyfikatorów URI jako nazw przestrzeni nazw nie jest rygorystyczny: można po prostu użyć losowych ciągów znaków. Ta opcja będzie również działać:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Korzystanie z identyfikatorów URI ma jednak wiele zalet. Więcej na ten temat możesz przeczytać tutaj .

Podstawowe standardy XML

Standardy XML to zestaw rozszerzeń, które dodają dodatkową funkcjonalność do plików XML. XML ma wiele standardów, ale przyjrzymy się tylko najważniejszym i dowiemy się, na co pozwalają AJAX , jeden z najsłynniejszych standardów XML. Umożliwia zmianę zawartości strony internetowej bez jej ponownego ładowania! Brzmi nieźle? :) Tutaj możesz wypróbować tę technologię osobiście . XSLT - umożliwia konwersję tekstu XML na inne formaty. Na przykład, używając XSLT, możesz przekształcić XML w HTML! Celem XML, jak już powiedzieliśmy, jest opisywanie danych, a nie ich wyświetlanie. Ale używając XSLT możemy ominąć to ograniczenie! Oto sandbox z działającym przykładem, gdzie możecie sami przekonać się jak to działa :) XML DOM - pozwala na pobranie, zmianę, dodanie lub usunięcie 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>
Znajdują się w nim dwie książki. Książki posiadają taki element jak tytuł - <title>. Tutaj możemy użyć JavaScript, aby pobrać wszystkie tytuły książek z naszego pliku XML i wyprowadzić pierwszy z nich na konsolę:
<!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>
Jeszcze raz polecam zobaczyć jak ten przykład działa z wykorzystaniem piaskownicy :) DTD („definicja typu dokumentu”) - pozwala na zdefiniowanie listy dozwolonych elementów dla jakiejś encji w pliku XML. Na przykład pracujemy nad witryną księgarni i wszystkie zespoły programistów zgodziły się, że w przypadku elementu książki w plikach XML należy określić tylko atrybuty tytułu, autora i roku. Ale jak możemy chronić 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 <book>. Spróbuj dodać tam nowy element, a od razu 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 tu dozwolony” Istnieje wiele innych standardów XML. Możesz zapoznać się z każdym z nich i spróbować głębiej zagłębić się w kod na stronie WC3 (sekcja „Ważne standardy XML”). I w ogóle, jeśli potrzeba informacji o XML-u, można tam znaleźć prawie wszystko :) No cóż, nasz wykład dobiegł końca. Czas wrócić do zadań! :) Do zobaczenia!
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION