Czym jest XML
XML (ang. Extensible Markup Language) to specyfikacja zapisu danych, która została opracowana w 1998 roku przez W3C (ang. World Wide Web Consortium). Jest to format tekstowy, który pozwana na zapisywanie danych w postaci, która jest łatwa do odczytu zarówno przez maszyny jak i przez ludzi1.
Aby dane w formacie XML uważano za poprawne muszą one mieć pewną strukturę, proszę spójrz na przykład poniżej, który pokazuje poprawne dane w formacie XML:
<?xml version="1.0" encoding="UTF-8"?>
<kurs-java>
<artykul publikacja=”2017-03-01”>
<tytul>Wprowadzenie do XML w Javie</tytul>
<autor>Marcin Pietraszek</autor>
</artykul>
<artykul>
<!-- do uzupelnienia -->
</artykul>
<opis status=”do uzupelnienia”/>
<wydawca:opis>Zestaw artykułów dotyczących programowania w języku Java</wydawca:opis>
</kurs-java>
Przykładowy dokument powyżej może służyć do opisu kursu programowania Java znajdującego się na Samouczku. Równie dobrze możesz stworzyć plik, który zawierał będzie informacje na temat pogody, stopni w szkole czy jakiegokolwiek innego tematu.
Opis formatu XML
Dokument XML składa się z zagnieżdżonych elementów. Są one zapisywane jako znaczniki w postaci <znacznik></znacznik>
.
Na początek drobna dygresja na temat węzłów i elementów. Czytając inne źródła po polsku na temat XML natkniesz się na nazwę węzeł. Sam próbując znaleźć poprawny odpowiednik w języku polskim nie znalazłem zbyt wielu wzmianek o węzłach (ang. node) w specyfikacji. Specyfikacja opisuje elementy (ang. element). Dlatego w tym artykule posługiwał będę się wyłącznie określeniem element. Z racji tego, że XML ma strukturę drzewiastą, a w “pracy z drzewami” mówi się o węzłach często też ten termin używany jest w odniesieniu do elementów dokumentu XML.
Element główny
Każdy poprawny dokument XML musi mieć wyłącznie jeden element główny (ang. root element). W przykładzie powyżej jest to element <kurs-java>
.
Zawartość elementów
Elementy wewnątrz mogą zawierać treść. Na przykład wewnątrz elementu <tytul>
znajduje się treść Wprowadzenie do XML w Javie
.
Elementy wewnątrz mogą zawierać kolejne elementy. Na przykład element <artykul>
zawiera wewnątrz elementy <tytul>
i <autor>
. Można to porównać do drzewa gdzie z jednego pnia (elementu głównego) wyrasta kilka gałęzi (elementów zagnieżdżonych), zakończonych liśćmi. W praktyce mówiąc o liściach dokumentu XML mamy na myśli właśnie te najbardziej zagnieżdżone elementy. W naszym przykładzie będą to na przykład <tytul>
czy <autor>
.
Atrybuty
Elementy mogą posiadać dowolną liczbę atrybutów. Za przykład mogą posłużyć tu element <artykul>
zawierający atrybut publikacja
. Zawartość atrybutu to zwykły tekst. W przeciwieństwie do elementów nie możemy stosować “zagnieżdżania” – wewnątrz atrybutu nie możemy umieścić niczego poza jego wartością.
Przestrzenie nazw
Nazwy elementów elementów i atrybutów mogą zawierać tak zwaną “przestrzeń nazw” (ang. namespace). Do oddzielenia nazwy elementu czy atrybutu od przestrzeni nazw używa się dwukropka. W przykładzie powyżej element <wydawca:opis>
pochodzi z przestrzeni nazw wydawca
.
Przestrzenie nazw stosuje się aby móc odróżnić znaczenie elementów o tej samej nazwie. W przykładzie elementy <opis>
i <wydawca:opis>
mogą zawierać zupełnie różne dane – różne rodzaje opisów.
Pobierz opracowania zadań z rozmów kwalifikacyjnych
Przygotowałem rozwiązania kilku zadań algorytmicznych z rozmów kwalifikacyjnych. Rozkładam je na czynniki pierwsze i pokazuję różne sposoby ich rozwiązania. Dołącz do grupy ponad 6147 Samouków, którzy jako pierwsi dowiadują się o nowych treściach na blogu, a prześlę je na Twój e-mail.
Komentarze
Wewnątrz dokumentu XML możesz umieszczać komentarze. W przykładzie powyżej komentarz to <!-- do uzupelnienia -->
. Wszystko co znajduje się pomiędzy <!--
i -->
uważane jest jako komentarz.
Prolog
Dokument XML powinien zawierać prolog. Częścią prologu jest deklaracja <?xml version="1.0" encoding="UTF-8"?>
zawiera ona informację o wersji XML, której używamy. Może także wskazać kodowanie znaków jakie zostało użyte w danym dokumencie. Wewnątrz prologu mogą znajdować się także deklaracje DTD (ang. Document Type Declaration) opisujące dany dokument. W opisie tym możemy na przykład określić, że element <artykul>
powinien zawsze zawierac element <autor>
.
Pozostałe wymagania dotyczące formatu
Każdy element musi się poprawnie zamykać. Na przykład <autor>Marcin Pietraszek</autor>
. Jeśli element nie ma treści, bądź innych zagnieżdżonych elementów zamyka się go w następujący sposób <opis status="do uzupelnienia"/>
.
Elementy powinny być poprawnie zagnieżdżone. Łatwiej będzie mi to wytłumaczyć na przykładzie. Poniżej możesz zobaczyć niepoprawny fragment dokumentu XML:
<artykul>
<tytul>
<autor>
</tytul>
</autor>
</artykul>
Zauważ, że element tytul
zamknięty jest przed elementem autor
. Jest to niepoprawny sposób zagnieżdżania elementów. Możemy powiedzieć, że elementy, które nie są poprawnie zagnieżdżone “nachodzą” na siebie.
Białe znaki pomiędzy elementami są ignorowane. W praktyce często używa się znaków tabulacji czy spacji do robienia “wcięć”. Dzięki temu tak sformatowane dokumenty są bardziej czytelne.
Rodzice, dzieci i rodzeństwo a XML
W przypadku poprawnie sformatowanych dokumentów XML możemy mówić o pewnych relacjach pomiędzy elementami. Specyfikacja XML mówi o rodzicach (ang. parent) i dzieciach (ang. child). W praktyce używa się także określenia rodzeństwo (ang. sibling).
Element może mieć wiele dzieci, na przykład element <kurs-java>
ma czworo dzieci – dwa elementy <artykul>
, element <opis>
i element <wydawca:opis>
.
Każdy element, poza elementem głównym, posiada dokładne jednego rodzica. Na przykład element <tytul>
ma rodzica <artykul>
.
Każdy element, poza elementem głównym, może mieć rodzeństwo. Na przykład rodzeństwem dla elementu <artykul>
jest kolejny element <artykul>
, <opis>
i <wydawca:opis>
.
Walidacja dokumentów XML
Jak widzisz w dokumencie XML możemy zawrzeć praktycznie wszystko. Liczba dostępnych formatów jest nieskończona. W związku z tym istnieją różne mechanizmy pozwalające na sprawdzenie poprawności dokumentów XML.
Za przykład mogą tu posłużyć wspomniane wcześniej elementy DTD (ang. Document Type Definition) znajdujace się wewnątrz dokumentu XML.
Innym sposobem na sprawdzenie poprawnej struktury dokumentu XML jest używanie XSD (ang. XML Schema Definition). Jest to zewnętrzny plik, który także jest w formacie XML. Wewnątrz tego pliku możemy dokładnie określić strukturę jaką powinien mieć inny dokument XML.
Dzięki takiej walidacji możemy na przykład zastrzec, że zawsze wewnątrz elementu <artykul>
musi znajdować się element <tytul>
a element <autor>
jest opcjonalny.
Wady i zalety formatu XML
Główną zaletą pracy z dokumentami XML jest to, że istnieje mnóstwo narzędzi pozwalających na ich przetwarzanie. Dokumenty te są w miarę czytelne dla człowieka. Z łatwością format ten może służyć do wymiany informacji pomiędzy różnymi programami.
Niestety nie jest to format idealny. Przy pracy z dużymi plikami XML przekonasz się, że wcześniej wspomniana czytelność nie jest już tak oczywista. Ponadto pliki XML są dość “rozwlekłe”. Z racji konieczności zamykania każdego elementu, znaczników w dokumencie XML jest dużo i często to one znacząco zwiększają ostateczną wielkość dokumentu.
Ponadto dokumenty bardziej czytelne dla człowieka automatycznie zajmują więcej miejsca. To człowiek potrzebuje wcięć w dokumencie XML, dla programu używającego plików XML takie wcięcia są zbędne.
Zastosowanie dokumentów w formacie XML
Z racji swojej dobrze zdefiniowanej struktury i ogromnego zestawu narzędzi dokumenty w formacie XML są bardzo popularne. Dedykowane narzędzia do pracy z XML dostępne są w wielu językach programowania. Dokumenty w formacie XML świetnie nadają się do zapisywania wszelkiego rodzaju ustawień.
Poniżej pokażę Ci kilka przykładowych zastosowań dokumentów w formacie XML:
- “poprzednik” opisanego przeze mnie Gradle’a – Maven używa XML w swoich plikach konfiguracyjnych - na przykład
settings.xml
,profiles.xml
czyplugin-registry.xml
. Główny plik konfiguracyjny dla projektu to także dokument XML –pom.xml
, - w jednym z banków, w którym pracowałem dokumenty XML wraz z XSLT służyły do generowania wszystkich drukowanych dokumentów,
- każda aplikacja na system Android używa plików XML. W uproszczeniu można powiedzieć, że opisują one wygląd ekranu aplikacji,
- dokumenty ODT (format używany na przykład przez Open Office), czy DOCX (format używany przez Microsoft Word) to tak naprawdę pliki zip, które wewnątrz zawierają dokumenty XML opisujące zawartość pliku, rozpakuj je a sam się przekonasz :)
Na XML świat się nie kończy
Oczywiście dokumenty XML nie są jedynym formatem, który może pomóc w wymianie danych. Poniżej wspominam o kilku innych formatach, które mogą być także użyte w tym celu.
- CSV – (ang. Comma Separated Values) zwykły plik tekstowy, w którym każdy wiersz zawiera dane oddzielone przecinkami2. Z racji tego, że jest to plik tekstowy można go z łatwością odczytać używając edytora tekstu.
- YAML – (ang. Yet Another Markup Language lub YAML Ain’t Markup Language) tekstowy format, w którym możemy zapisywać bardziej złożone struktury czy kolekcje.
- JSON – (ang. JavaScript Object Notation) podobnie jak YAML jest w stanie opisać listę elementów czy kolekcję par klucz-wartość. Format ten, jak jego nazwa wskazuje, powstał na potrzeby JavaScript, jednak obecne jest szeroko stosowany także w innych językach. Jest to format tekstowy.
Oczywiście poza formatami tekstowymi istnieją też formaty binarne:
- ProtocolBuffers – binarny format opracowany przez Google. Pozwala na zapisanie praktycznie dowolnych struktur. Z racji tego, że jest to format binarny jest bardziej “zwięzły” od wspomnianych powyżej. Oczywiście nie można odczytać tego formatu bez odpowiedniego “dekodowania” zawartości,
- Avro – binarny format serializacji danych, podobnie jak ProtoclBuffers zapewnia dużo bardziej zwięzłą reprezentację danych. Ma wbudowany mechanizm kompresji co pozwala na jeszcze większe zmniejszenie objętości dokumentów.
Bynajmniej nie są to wszystkie dostępne formaty wymiany danych. Wspomniałem o tych kilku aby pokazać Ci, że na XML świat się nie kończy :) Każdy z tych formatów dorobił się szerokiego wsparcia w różnych językach programowania.
Inne specyfikacje i narzędzia związane z XML
XML jako dość dojrzały format zapisu danych “dorobił się” zestawu narzędzi i specyfikacji. Na początek ten zestaw może okazać się przytłaczający, ale spokojnie – nie wszystkich tych narzędzi używa się w każdym projekcie. W większości przypadków wystarczy wiedza o poprawnym formacie dokumentu XML i znajomość jednego z narzędzi do tworzenia/czytania plików XML.
Lista poniżej to specyfikacje/narzędzia pozwalające na parsowanie i tworzenie plików w formacie XML:
- DOM (ang. Document Object Model),
- SAX (ang. Simple API for XML),
- StAX (ang. Streaming API for XML),
- JAXB (ang. Java Architecture for XML Binding).
W jednym z klejnych artykułów skupię się na praktycznym wykorzystaniu powyższych narzędzi.
Dodatkowo możesz też zainteresować się następującymi specyfikacjami związanymi z XML. Przydają się one w bardziej zaawansowanej pracy z dokumentami XML:
- XSD (ang. XML Schema Definition) – wcześniej wspomniana specyfikacja pomagająca w sprawdzeniu poprawności dokumentów XML,
- XPath (ang XML Path Language) – język pozwalający na wskazywanie elementów czy atrybutów w dokumencie XML, przy jego pomocy możesz na przykład określić “zwróć mi wszystkie elementy X, które mają atrybut Y o wartości Z”,
- XSLT (ang. Extensible Stylesheet Language Transformations) – język służący do tranformowania dokumentów XML. Przy jego pomocy można przekształcić dokument XML do innych formatów, na przykład do pliku PDF.
Podsumowanie
Po przeczytaniu artykułu wiesz już czym jest XML. Poznałeś część dozwolonych konstrukcji, wiesz czym są elementy i jak wygląda poprawnie sformatowany dokument XML. Potrafisz wskazać praktyczne zastosowania tego formatu, znasz też kilka jego zalet i wad. Przed Tobą użycie XML w praktyce, ale to już temat na kolejny artykuł :).
Mam nadzieję, że artykuł przypadł Ci do gustu. Jeśli nie chcesz pominąć kolejnych artykułów dopisz się do mojego newslettera i polub Samouczka na facebooku.
Na koniec mam do Ciebie standardową prośbę, podziel się linkiem do artykułu ze znajomymi, zależy mi na dotarciu do jak największej liczby samouków, którzy chcą pogłębiać swoją wiedzę. Do następnego razu!
Pobierz opracowania zadań z rozmów kwalifikacyjnych
Przygotowałem rozwiązania kilku zadań algorytmicznych z rozmów kwalifikacyjnych. Rozkładam je na czynniki pierwsze i pokazuję różne sposoby ich rozwiązania. Dołącz do grupy ponad 6147 Samouków, którzy jako pierwsi dowiadują się o nowych treściach na blogu, a prześlę je na Twój e-mail.
Zostaw komentarz