Wstęp do gradle artykuł
Wstęp do Gradle
19 stycznia 2017
pogodynka część 1. artykuł
Projekt Pogodynka – wprowadzenie
4 marca 2017
xml dla początkujących

W artykule tym przeczytasz o tym czym jest format XML. Poznasz kilka bibliotek czy specyfikacji używanych do przetwarzania tego formatu. Przeczytasz o wadach i zaletach pracy z plikami XML, poznasz też przykłady praktycznego zastosowania takiego formatu zapisu danych. Zapraszam do artykułu.

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 ludzi 1.

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:

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.

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:

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 walidację 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 walidację 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 czy plugin-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 na prawdę 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. Comman Separated Values) zwykły plik tekstowy, w którym każdy wiersz zawiera dane oddzielone przecinkami 2. 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 walidacji 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!

Newsletter

  Jeśli chcesz otrzymywać informacje o nowych artykułach na blogu prosto na Twój email, zapisz się 🙂

Zdjęcie dzięki uprzejmości https://www.flickr.com/photos/stanzim/27926733595/sizes/l

  1. Moim zdaniem skomplikowane pliki XML w cale nie są czytelne dla ludzi, ale to już temat na osobną dyskusję ;).
  2. Istnieją też inne wersje gdzie przecinek zastąpiony jest średnikiem czy znakiem tabulacji

2 Komentarze

  1. Rafał napisał(a):

    Witam. Dziękuje za kolejny zwięzły i zrozumiały materiał i mam pytanie czy w planach masz napisanie artykuł o XPath, coś na wzór artykułu o Wyrażeniach regularnych który był genialny?

    • Marcin Pietraszek napisał(a):

      Cześć Rafał! Bardzo dziękuję za słowa uznania 🙂 Jeśli chodzi o XPath, to dopiszę to do długej listy „artykułów do napisania” – dzięki za sugestię. Jednak szczerze mówiąc nie przewiduję zbyt szybkiego pojawienia sie takiego artykułu z jednego prostego powodu.

      Bardzo dużo ludzi prosiło mnie o artykuły związane z Hibernate i Spring, ale żeby dojść do tych narzędzi trzeba przerobić podstawy. Pisząc o podstawach mam na myśli:

      • Servlety,
      • JSP,
      • JSTL,
      • JSP EL,
      • JPA,
      • Java Bean Validation,
      • SQL,,
      • AOP (transakcyjność w Spring)

      Dopiero po tym wstępie zabiorę się za Spring Core, Spring MVC czy Spring Data w połączeniu z Hibernate. Aktualnie kończę pisać artykuły związane z serwletami, w planach mam jeszcze jeden, może dwa. Sam widzisz jaka lista czeka dalej, a każdy z tych skrótów to kilka niekrótkich artykułów.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *