fbpx

W dzisiejszym wpisie zajmę się tematem pokrewnym do tego, który poruszyłem kilka tygodni temu. Chodzi o artykuł format JSON. W przeciwieństwie do JSON XML jest niewątpliwie dużo bardziej rozbudowany. Przez co jest nieco trudniejszy w pełnym zrozumieniu, mimo iż przypomina składnią język HTML.

Postaram się rozwiać Twoje wszystkie wątpliwości i niejako dać Ci możliwość porówniania tych dwóch rodzajów wymiany danych między aplikacjami. 

Odpowiem na następujące pytania:

  • Czym jest język znaczników XML?
  • Gdzie się go wykorzystuje?
  • Jakie ma wady i zalety?
  • Jak wygląda przykładowe użycie w języku C#?

Standardowo cztery pytania postawione, czas zabierać się za właściwą część artykułu.

Zatrzymaj się!


Książka „Programistą być” to obowiązkowa pozycja dla każdego, kto interesuje się tematem programowania!

Z książki dowiesz się między innymi o tym:

  • Czy matematykastudia techniczne i język angielski są konieczne do tego, by rozpocząć pracę jako programista?
  • Gdzie szukać informacji o programowaniu i w jaki sposób się uczyć?
  • Jak znaleźć pierwszą pracę i w jaki sposób rozwijać swój programistyczny potencjał?
  • Czym na co dzień zajmuje się programista?
  • Czy każdy może zostać programistą?

I wiele, wiele więcej…


Język znaczników XML – wprowadzenie

XML ceniony jest za swoją uniwersalność. Z angielskiego akronim ten oznacza Extensible Markup Language, czyli tłumacząc na polski rozszerzalny język znaczników. Już z samego rozszyfrowania skrótu widać, że XML jest traktowany jako język znaczników, czyli w gruncie rzeczy tak samo, jak HTML. Jest on niezależny od platformy i języka programowania, w którym będziemy mieli potrzebę go zaimplementować. W dobie internetu XML jest rekomendowany do wymiany danych pomiędzy systemami, jednak coraz większa grupa organizacji i zwolenników języka JavaScript przechyla szalę na korzyść formatu JSON.

Ale zacznijmy od początku, ponieważ musimy zrozumieć, czym jest w ogóle język znaczników. Ludzkość od czasu wynalezienia pisma próbuje na różne sposoby oznaczać dokumenty. Czy to będą kolorowe zakreślacze, kolorowania czcionek czy zwykłe użycie zakładek.

W przypadku elektronicznym znaczniki przybierają formę pewnego znaku lub słowa kluczowego, które opisuje dane pole. Często w żargonie programistycznym nazywany jest tagiem. W przypadku XML znaczniki podzielone są na dwa typy — otwierający i zamykający, więc przyjrzyjmy się im bliżej.

Historia XML

14 listopada 1996 roku to dzień, w którym światło dzienne ujrzała pierwsza wersja języka XML. Była to wersja robocza, od której wszystko się zaczęło. 10 lutego 1998 roku poszła w świat informacja, że W3C zarekomendowała XML w wersji 1.0. Gdyby jednak spojrzeć na język XML z nieco szerszej perspektywy, to zobaczymy tam firmę IBM, której pracownicy w latach 60 XX wieku opracowali język SGML (Standard Generalized Markup Language), czyli starszego brata XML. To późniejsza ewolucja SGML przyczyniła się do powstania omawianego w artykule języka. Następne lata przyniosły poprawioną wersję 1.1, która od 29 września 2006 obecna jest do dziś.

Składnia XML

Jak już pisałem, znacznik musi mieć swój początek i koniec. W przypadku XML jest to nawet w podwójny sposób interpretowane. Pierwsze otwarcie to nawiasy < oraz >, gdzie pomiędzy nawiasami wstawić musimy nazwę i opcjonalnie atrybuty. Tak przygotowany znacznik to znacznik nadrzędny, otwierający. Musi on posiadać zakończenie z taką samą nazwą oraz znakiem slash /. Dla przykładu znacznik imię <imie>Mateusz</imie>.

Spójrz jeszcze na pierwszą linię, która zawiera znacznik z dwoma atrybutami — version oznaczające wersję pliku XML oraz encoding sygnalizujące kodowanie. Składnia XML musi być samoopisująca, czyli znaczniki powinny być tak nazwane, by w sposób łatwy dla użytkownika można było rozszyfrować, co znajduje się w danym fragmencie XML.

Znacznik xml jest znacznikiem głównym (nadrzędnym), często nazywanym rodzicem lub rootem. Znacznik nadrzędny zawsze musi posiadać znaczniki podrzędne nazywane dziećmi. W tym przypadku znacznik xml posiada znacznik osoba. Znacznik osoba posiada podrzędne znaczniki imie, nazwisko, zawod oraz hobby. Znaczniki na tym samym poziomie, tak jak wspomniane imie i nazwisko są dla siebie rodzeństwem.

<?xml version="1.0" encoding="UTF-8"?>
   <osoba>
       <imie>Mateusz</imie>
       <nazwisko>Rus</nazwisko>
       <zawod>Programista</zawod>
       <hobby>Siatkowka</hobby>
   </osoba>

Zastosowania XML

Jak widzimy, składnia XML jest bardzo prosta i uniwersalna. Można go stosować niemal w każdym systemie, który tworzymy. Najpopularniejsze zastosowania XML to:

  • elektroniczna wymiana danych (EDI);
  • dokumenty ODT, czyli format używany na przykład przez Open Office;
  • multimedia, na przykład zastosowanie w SVG;
  • specjalistyczne struktury danych;
  • protokoły komunikacyjne;
  • deskryptory zasobów sieciowych;

Język XML był też bazą do stworzenia kilku niszowych języków, takich jak:

  • matematyczny język MathML (Mathematical Markup Language) służący do opisu formuł matematycznych;
  • XHTML (Extensible HyperText Markup Language) służący do tworzenia stron internetowych;
  • XUL (XML-based User-interface Language) służący do opisu interfejsu użytkownika;

Atrybuty XML

Tak samo, jak w HTML, tak i w języku znaczników XML mamy dostępne coś, co nazywa się atrybutami. Zobaczmy raz jeszcze przykład XML, lecz lekko zmodyfikowany w stosunku do poprzedniego.

Po pierwsze został dodany atrybut plec, w którym zapisana została informacja o płci. Drugim atrybutem będzie dodany drugieImie, który zawiera informacje o drugim imieniu. Atrybut służy do przechowywania danych specyficznych dla całego obiektu. W tym przypadku obiektem jest osoba, która reprezentuje mnie.

<?xml version="1.0" encoding="UTF-8"?>
   <osoba plec="meżczyzna">
       <imie drugieImie="Dawid" >Mateusz</imie>
       <nazwisko>Rus</nazwisko>
       <zawod>Programista</zawod>
       <hobby>Siatkowka</hobby>
   </osoba>

Warto dodać, że atrybut mogę ustawić równie dobrze jako znacznik, wtedy struktura XML wygląda następująco.

<?xml version="1.0" encoding="UTF-8"?>
   <osoba gender="male">
       <plec>mężczyzna</plec>
       <imie>Mateusz</imie>
       <drugieImie>Dawid</drugieImie>
       <nazwisko>Rus</nazwisko>
       <zawod>Programista</zawod>
       <hobby>Siatkowka</hobby>
   </osoba>

Walidacja XML

Jak każdy język, tak samo XML musi spełniać pewne warunki, które powodują, że składnia jest poprawna. Z dokumentem XML nie jest inaczej i musi zawierać kilka podstawowych warunków:

  • Każdy element musi posiadać znacznik początku i końca;
  • Nazwy elementów nie mogą rozpoczynać się od znaków – (myślnik, łącznik), . (kropki) oraz cyfry;
  • Element pusty może zawierać znacznik bez zakończenia i określa się go jako <znacznik />;
  • Musi zawierać deklarację XML, która jest zawsze umieszczona na początku pliku;
  • Wewnątrz elementów nie można stosować niektórych znaków, na przykład początek i koniec znacznika < >;
  • W znacznikach XML rozróżniana jest wielkość liter;
  • Wartości atrybutów XML muszą być ujęte w cudzysłów;

Poprawność prostego XML można zweryfikować na stronie https://www.xmlvalidation.com/.

Język znaczników XML – wady i zalety

Jak każdy język czy narzędzie stosowane w programowaniu, tak samo XML ma swoje mniejsze lub większe wady oraz zalety. Wymienię po pięć najważniejszych.

Zalety

  1. XML jest niezależny od środowiska, w jakim pracujemy oraz języka, jakiego używamy. Nie jest istotne czy jest to Linux, MacOS czy Windows. Nie ważne czy pracujemy z C#, Javą, Python, JS czy PHP. Myślę, że jest to kluczowa zaleta, by używać XML w swoich projektach.
  2. Bardzo łatwo jest walidować dokumenty XML, ponieważ wystarczy brak w składni lub pomieszana struktura danych. Do walidacji powstała masa narzędzi i bibliotek, więc używając ich jako programiści mamy niemal 100% pewność, że dane przekażemy z systemu do systemu w poprawny sposób.
  3. XML jest dużo bardziej czytelny dla człowieka niż chociażby JSON. Bardzo łatwo można znaleźć potrzebne elementy, otwierając plik w dowolnym edytorze tekstu. Ludzkie oko bardzo szybko wychwytuje główne elementy i widać dokładnie strukturę dokumentu. Ze względu na to, że dokument XML możemy otworzyć w dowolnym edytorze tekstu, to dane XML nie wymagają żadnej konwersji podczas przesyłania między różnymi systemami.
  4. XML obsługuje Unicode. O Unicode pisałem osobny artykuł. Dla przypomnienia Unicode to międzynarodowy standard kodowania do użytku z różnymi językami i skryptami, w którym każdej literze, cyfrze lub symbolowi przypisywana jest unikalna wartość numeryczna, która ma zastosowanie na różnych platformach i programach. Ta funkcja umożliwia w XML przesyłanie dowolnych informacji napisanych w dowolnym ludzkim języku.
  5. Język XML pozwala w prosty sposób rozbudować strukturę o nowe znaczniki lub atrybuty. Nie wpływa to na dane już wcześniej zawarte w pliku XML. Można w prosty sposób przegenerować dane według nowego szablonu oraz odczytać je i wprowadzić zmiany w obiekcie podczas rozczytania danych.

Wady

  1. Największym zarzutem w stronę XML w porównaniu, chociażby z JSON jest nadmiarowość znaków. Powoduje to rozrost plików z danymi. Dla przykładu format JSON nie zawiera zamykających znaczników, które w XML są obowiązkowe. To jeden z tych parametrów, który jest nadmiarowy, lecz konieczny. Do tego dochodzi koszt transferu danych. Przy ekstremalnej potrzebie wydajności systemu trzeba mocno zastanowić się nad wymianą danych za pomocą XML.
  2. XML nie obsługuje tablic, co jest mocno problematyczne w przypadku, gdy taką strukturę chcemy przekazać. Dane wtedy trzeba spłaszczyć i wrzucić na przykład w JSON lub innym formacie danych. Następnie użyć odpowiedniego parsera, który te dane odpowiednio odczyta.
  3. Przestrzenie nazw XML są trudne w użyciu i nie mogą być poprawnie zaimplementowane w parserze XML. Jest to jeden z problemów, który można spotkać między innymi w protokole komunikacyjnym SOAP. Gdy pojawiają się metody, które zawierają w sobie identycznie brzmiące znaczniki, to możemy mieć poważny problem po stronie aplikacji z mapowaniem pól. Temat ten będzie rozwinięty w osobnym wpisie na temat protokołu SOAP.
  4. Mała elastyczność, jeśli chodzi o przesyłanie danych. Musimy uważać, by w przekazywanych danych nie pojawiły się zakazane znaki, takie jak znaki nawiasów ostrych < >. Gdy do pliku XML chcemy wstawić długie opisy lub specyficzne nazwy produktów, na przykład „Ogranicznik przepięć C <typ 2>”, to przy takim tekście mamy duży problem. Wtedy trzeba kombinować i używać funkcji zamieniającej znak < oraz > na dowolne inne ciągu znaków.
  5. Przy dużych rozmiarach plików czytelność nie jest już taką zaletą. Mnogość wskaźników o tej samej nazwie bardzo mocno zaciemnia całość dokumentu i łatwo pogubić się w tym, która część jest zagnieżdżona w której.

Język znaczników XML – implementacja

Kod poniżej zaimplementowałem w języku C#, gdzie na pierwszy ogień biorę metodę do tworzenia pliku XML. Posłużę się dwiema metodami — CreateXml oraz drugiej pomocniczej o nazwie CreateNode.

Po pierwsze, w linii 15 powołuję do życia obiekt writer, który do konstruktora dostaje nazwę pliku, pod jakim ma się zapisać plik XML oraz kodowanie.

Po drugie w liniach od 16 do 18 rozpoczynam dokument, dodaję rodzaj formatowania oraz głębokość wcięć.

I po trzecie, czas na budowę struktury XML. Gałąź główna w moim XML będzie mieć nazwę osoba. Następnie tworzę pola, zgodnie z budową XML z powyższego przykładu bez atrybutów. Do budowy zagnieżdżonych elementów używam pomocniczej metody CreateNode, do które przekazuję nazwę znacznika, wartość oraz obiekt writer, do którego dopisuję kolejne pozycje XML. Na zakończenie prezentuję w konsoli informację o powodzeniu. 

Pozostaje w funkcji Main wywołać metodę i ocenić wynik w katalogu z programem.

using System;
using System.Xml;

namespace WpisXML
{
    internal class Program
    {
        static void Main(string[] args)
        {
            CreateXml();
        }

        static private void CreateXml()
        {
            XmlTextWriter writer = new XmlTextWriter("Osoba.xml", System.Text.Encoding.UTF8);
            writer.WriteStartDocument(true);
            writer.Formatting = Formatting.Indented;
            writer.Indentation = 2;
            writer.WriteStartElement("osoba");
            CreateNode("imie", "Mateusz", writer);
            CreateNode("nazwisko", "Rus", writer);
            CreateNode("zawod", "Programista", writer);
            CreateNode("hobby", "Siatkowka", writer);
            writer.WriteEndElement();
            writer.WriteEndDocument();
            writer.Close();
            Console.WriteLine("Plik XML został stworzony!");
        }

        static private void CreateNode(string tag, string value, XmlTextWriter writer)
        {
            writer.WriteStartElement(tag);
            writer.WriteString(value);
            writer.WriteEndElement();
        }
    }
}

Odczyt danych jest równie prosty. Przygotowałem do tego celu metodę ReadXml. W 15 linii tworzę obiekt, później zostaje on rozczytany i w pętli while czytam linia po linii plik. Następnie w konstrukcji switch-case rozczytuję nazwy znaczników, ich wartości oraz zamykam znacznik. Wynik tego działania zamieściłem na zrzucie ekranu poniżej kodu.

using System;
using System.Xml;

namespace WpisXML
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ReadXml();
        }

        static private void ReadXml()
        {
            XmlTextReader reader = new XmlTextReader("Osoba.xml");
            reader.Read();
            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element:
                        Console.Write("<{0}>" , reader.Name);
                        break;
                    case XmlNodeType.Text:
                        Console.Write(reader.Value);
                        break;
                    case XmlNodeType.EndElement:
                        Console.Write("</{0}>", reader.Name);
                        break;
                }
            }

           Console.ReadLine();
        }
    }
}

Możesz w komentarzu pochwalić się swoim kodem i dodatkowo proponuję rozbudować mój kod o atrybuty przy tworzeniu XML oraz uporządkować XML wyjściowy w metodzie ReadXml.

Ponadto odpowiedz na pytanie, czy stworzony plik XML przez metodę CreateXml jest poprawny zgodnie z walidacjami opisanymi powyżej. Kod całego programu znajdziesz na moim GitHub.

Język znaczników XML – podsumowanie

Na temat XML powstają dziś grube książki, które pokazują najdrobniejsze szczegóły związane z tym językiem. Ja celowo skupiłem się jedynie na najistotniejszych elementach i przybliżyłem moją ulubioną historię.

Nic poza tą wiedzę raczej nie będziesz stosować, a jeśli już pojawi się taka potrzeba, to znajdziesz ją w bardziej zaawansowanych publikacjach. Uwierz mi jednak, że może to nigdy nie nastąpić, ze względu na specyfikę pracy z XML w kodzie.

Jeśli masz jakieś pytania, to śmiało pisz na maila lub zostaw komentarz poniżej.

Kolejny wpis będzie z serii Python 3 by MR i poruszam w nim temat zmiennych, komentarzy, IDE czy operatorów.!

PS. Będę wdzięczny za komentarze pod tym postem!

PS2. Czeka też na Ciebie prezent. Wystarczy, że zapiszesz się na Newsletter poniżej!

PS3. Dołącz do naszej grupy na Facebook!

Subskrybuj

Zapisz się do Mailowej Akademii Programowania.

MAP to jedyne takie miejsce, gdzie co niedzielę otrzymasz rozwiązanie programistycznego zadania.

Do tego otrzymasz darmowe konsultacje w przypadku odpowiedzi na moje maile. Wspólnie staniemy się lepszymi programistami!

Nie przegap i dołącz już dziś do 747 osób będących w MAP!

Brzmi ciekawie? Nie zwlekaj i dołącz już teraz!

PS. Na start otrzymasz bonus w formie PDF z rozwiązanymi dziesięcioma programistycznymi problemami!

Autor

👨‍💻 .NET and Python programming passionate 🏦 Digtial Banking Solutions 🎓 Student 📊 Psychology 📚 Bookworm 🏠 Warsaw

1 Komentarz

  1. Hej Mateusz,

    Bardzo fajny artykuł. Z XML miałem styczność podczas robienia sobie takiego swojego projektu listy ToDo w JS. Wtedy dane użytkownika zapisywałem w pliku XML. Podczas tego projektu zauważyłem że są czasem problemy z parsowaniem takiego pliku z powodu pustych nodów. Myślę że taki problem z powodzeniem można rozwiązać pisząc funkcje / metodę pomocniczą. Wtedy jednak dopiero zaczynałem przygodę z programowaniem.

    Nie wiem dlaczego ale JSON wydaje mi się lepszym sposobem na wymianę danych, jest bardziej cool 😋.

    Pozdrawiam.

Napisz komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

Programistą być to przewodnik po programistycznym świecie, który każdy zainteresowany programowaniem powinien przeczytać!

X