JavaRush /Blog Java /Random-PL /Podstawy XML dla programisty Java — część 1 z 3
Ярослав
Poziom 40
Днепр

Podstawy XML dla programisty Java — część 1 z 3

Opublikowano w grupie Random-PL
XML jest obecnie bardzo popularnym i elastycznym formatem. Każdy programista powinien to zrozumieć, to po prostu pozycja obowiązkowa. Wiele technologii jest dziś połączonych, aktywnie z nich korzystają, a wśród nich są nowoczesne.
Podstawy XML dla programisty Java — część 1 z 3 — 1

Wstęp

Witam, drodzy czytelnicy mojego artykułu. Chcę od razu powiedzieć, że to dopiero pierwszy artykuł z mojego cyklu trzech artykułów. Głównym celem całej serii jest wprowadzenie każdego czytelnika w świat XML i jeśli nie pełne wyjaśnienie i zrozumienie, to przynajmniej dobry impuls w tym kierunku, wyjaśniając główne punkty i rzeczy. Cały cykl będzie dotyczył jednej nominacji - „Dbałość o szczegóły” , a podział na 3 artykuły zostanie dokonany tak, aby zmieścić się w limicie znaków w postach i podzielić dużą ilość materiału na mniejsze porcje dla lepszego zrozumienia. Pierwszy artykuł poświęcony będzie samemu XMLowi i temu, czym jest, a także jednemu ze sposobów tworzenia schematu dla plików XML - DTD. Na początek chciałbym zrobić małą przedmowę dla tych, którzy nie są jeszcze zaznajomieni z XML-em: nie ma się czego bać. XML nie jest bardzo skomplikowany i powinien być zrozumiały dla każdego programisty, ponieważ jest to obecnie bardzo elastyczny, wydajny i popularny format plików do przechowywania różnorodnych informacji. XML jest używany w Ant, Maven i Spring. Każdy programista potrzebuje znajomości języka XML. Teraz, gdy już zebrałeś siły i motywację, zacznijmy się uczyć. Postaram się rozłożyć cały materiał tak prosto, jak to możliwe, zbierając tylko najważniejsze i nie wchodząc w chwasty.

XML-a

Aby uzyskać jaśniejsze wyjaśnienie, lepiej byłoby zwizualizować XML na przykładzie.
<?xml version="1.0" encoding="UTF-8"?>
<company>
    <name>IT-Heaven</name>
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee>
                    <name>Maksim</name>
                    <job>Middle Software Developer</job>
                </employee>
                <employee>
                    <name>Ivan</name>
                    <job>Junior Software Developer</job>
                </employee>
                <employee>
                    <name>Franklin</name>
                    <job>Junior Software Developer</job>
                </employee>
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee>
                    <name>Herald</name>
                    <job>Middle Software Developer</job>
                </employee>
                <employee>
                    <name>Adam</name>
                    <job>Middle Software Developer</job>
                </employee>
                <employee>
                    <name>Leroy</name>
                    <job>Junior Software Developer</job>
                </employee>
            </employees>
        </office>
    </offices>
</company>
HTML i XML mają podobną składnię, ponieważ mają wspólnego rodzica - SGML. Jednak w HTML są tylko stałe znaczniki określonego standardu, natomiast w XML możesz tworzyć własne znaczniki, atrybuty i ogólnie robić, co chcesz, przechowując dane w sposób, który Ci odpowiada. Tak naprawdę pliki XML może odczytać każdy, kto zna język angielski. Ten przykład można przedstawić za pomocą drzewa. Podstawy XML dla programisty Java — część 1 z 3 — 2Korzeń drzewa to Firma. Jest to także element główny (korzeń), z którego pochodzą wszystkie inne elementy. Każdy plik XML może mieć tylko jeden element główny. Musi być zadeklarowany po deklaracji pliku xml (pierwsza linia w przykładzie) i zawierać wszystkie pozostałe elementy. Trochę o deklaracji: jest ona obowiązkowa i potrzebna do identyfikacji dokumentu jako XML. Posiada trzy pseudoatrybuty (specjalne predefiniowane atrybuty): wersję (zgodnie ze standardem 1.0), kodowanie (kodowanie) i standalone (autonomia: jeśli tak i do dokumentu podłączone są zewnętrzne schematy, to wystąpi błąd, domyślnie nie jest). Elementy to jednostki przechowujące dane przy użyciu innych elementów i atrybutów. Atrybuty to dodatkowe informacje o elemencie, które są podawane podczas dodawania elementu. Jeśli przełożymy wyjaśnienie na pole OOP, możemy podać następujący przykład: mamy samochód, każdy samochód ma cechy (kolor, pojemność, marka itp.) - są to atrybuty i istnieją byty, które znajdują się w samochodzie : drzwi, szyby, silnik, kierownica to pozostałe elementy. Możesz przechowywać właściwości jako pojedyncze elementy lub jako atrybuty, w zależności od potrzeb. W końcu XML jest niezwykle elastycznym formatem przechowywania informacji o wszystkim. Po wyjaśnieniach wystarczy spojrzeć na powyższy przykład, aby wszystko się ułożyło. W przykładzie opisaliśmy prostą strukturę firmy: jest firma, która ma nazwę i biura, a w biurach są pracownicy. Elementy Pracownicy i Biura są elementami opakowującymi - służą do gromadzenia elementów tego samego typu, w zasadzie łącząc je w jeden zestaw dla ułatwienia przetwarzania. Na szczególną uwagę zasługuje piętro i pokój. Są to atrybuty biura (piętro i numer), czyli inaczej jego właściwości. Gdybyśmy mieli element „obrazu”, moglibyśmy przenieść jego wymiary. Możesz zauważyć, że firma nie ma atrybutu nazwy, ale zawiera element nazwy. Możesz po prostu opisywać struktury tak, jak chcesz. Nikt nie zmusza Cię do zapisywania wszystkich właściwości elementów wyłącznie w atrybutach; możesz używać samych elementów i zapisywać w nich pewne dane. Na przykład możemy zapisać nazwisko i stanowisko naszych pracowników jako atrybuty:
<?xml version="1.0" encoding="UTF-8"?>
<company>
    <name>IT-Heaven</name>
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="Maksim" job="Middle Software Developer">

                </employee>
                <employee name="Ivan" job="Junior Software Developer">

                </employee>
                <employee name="Franklin" job="Junior Software Developer">

                </employee>
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer">

                </employee>
                <employee name="Adam" job="Middle Software Developer">

                </employee>
                <employee name="Leroy" job="Junior Software Developer">

                </employee>
            </employees>
        </office>
    </offices>
</company>
Jak widać, teraz imię i stanowisko każdego pracownika są jego atrybutami. I możesz zauważyć, że wewnątrz encji pracownika (tagu) nie ma nic, wszystkie elementy pracownika są puste. Następnie możesz uczynić pracownika pustym elementem - zamknij go natychmiast po zadeklarowaniu atrybutów. Odbywa się to po prostu, wystarczy dodać ukośnik:
<?xml version="1.0" encoding="UTF-8"?>
<company>
    <name>IT-Heaven</name>
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="Maksim" job="Middle Software Developer" />
                <employee name="Ivan" job="Junior Software Developer" />
                <employee name="Franklin" job="Junior Software Developer" />
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer" />
                <employee name="Adam" job="Middle Software Developer" />
                <employee name="Leroy" job="Junior Software Developer" />
            </employees>
        </office>
    </offices>
</company>
Jak widać zamykając puste elementy zachowaliśmy całą integralność informacji i znacznie skróciliśmy zapis, czyniąc informacje bardziej zwięzłymi i czytelnymi. Aby dodać komentarz (tekst, który zostanie pominięty podczas analizowania pliku) w formacie XML, należy zastosować następującą składnię:
<!-- Iwan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
I ostatnia konstrukcja to CDATA , co oznacza „dane znakowe”. Dzięki tej konstrukcji możliwe jest napisanie tekstu, który nie będzie interpretowany jako znaczniki XML. Jest to przydatne, jeśli w pliku XML znajduje się jednostka przechowująca znaczniki XML w informacjach. Przykład:
<?xml version="1.0" encoding="UTF-8" ?>
<bean>
    <information>
        <![CDATA[<name>Ivan</name><age>26</age>]]>
    </information>
</bean>
Rzecz w XML-u polega na tym, że możesz go dowolnie rozszerzać: użyj własnych elementów, własnych atrybutów i ustrukturyzuj go według własnego uznania. Do przechowywania danych można używać zarówno atrybutów, jak i elementów (jak pokazano w wcześniejszym przykładzie). Musisz jednak zrozumieć, że możesz wymyślać własne elementy i atrybuty na bieżąco i jak chcesz, ale co jeśli pracujesz nad projektem, w którym inny programista chce przenieść element name do atrybutów, a całą logikę programu jest napisane tak, że nazwa była elementem? Jak stworzyć własne reguły dotyczące tego, jakie powinny być elementy, jakie mają atrybuty i inne rzeczy, aby móc walidować pliki XML i mieć pewność, że reguły staną się standardem w Twoim projekcie i nikt ich nie złamie? Aby napisać wszystkie reguły własnego znacznika XML, istnieją specjalne narzędzia. Najbardziej znane: DTD i XML Schema. W tym artykule omówimy tylko pierwszy.

DTD

DTD tworzone jest w celu opisu typów dokumentów. DTD staje się już przestarzałe i obecnie jest aktywnie porzucane w formacie XML, ale nadal istnieje wiele plików XML korzystających z DTD i ogólnie warto je zrozumieć. DTD to technologia sprawdzania poprawności dokumentów XML . DTD deklaruje szczegółowe zasady dla typu dokumentu: jego elementy, jakie elementy mogą znajdować się w elemencie, atrybuty, czy są wymagane, czy nie, liczbę ich powtórzeń, a także Podmioty. Podobnie jak XML, DTD można zwizualizować za pomocą przykładu w celu uzyskania jaśniejszego wyjaśnienia.
<!-- Объявление возможных элементов -->
<!ELEMENT employee EMPTY>
<!ELEMENT employees (employee+)>
<!ELEMENT office (employees)>
<!ELEMENT offices (office+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (name, offices)>

<!-- Добавление атрибутов для элементов employee и office -->
<!ATTLIST employee
        name CDATA #REQUIRED
        job  CDATA #REQUIRED
>

<!ATTLIST office
        floor CDATA #REQUIRED
        room  CDATA #REQUIRED
>

<!-- Добавление сущностей -->
<!ENTITY M "Maksim">
<!ENTITY I "Ivan">
<!ENTITY F "Franklin">
Tutaj mamy taki prosty przykład. W tym przykładzie zadeklarowaliśmy całą naszą hierarchię z przykładu XML: pracownik, pracownicy, biuro, biura, nazwa, firma. Aby utworzyć pliki DTD, istnieją 3 główne konstrukcje używane do opisu dowolnych plików XML: ELEMENT (do opisu elementów), ATTLIST (do opisu atrybutów elementów) i ENTITY (do zastąpienia tekstu skróconymi formami). ELEMENT Używany do opisu elementu. Elementy, które można zastosować w ramach opisywanego elementu, są wymienione w nawiasach w formie listy. Do wskazania ilości możesz użyć kwantyfikatorów (są one podobne do kwantyfikatorów z wyrażeń regularnych): +oznacza 1+ *oznacza 0+ ?oznacza 0LUB 1 Jeśli nie dodano żadnych kwantyfikatorów, to zakłada się, że powinien być tylko 1 element. Gdybyśmy potrzebowali jednego z grupy elementów, moglibyśmy zapisać to w ten sposób:
<!ELEMENT company ((name | offices))>
Wtedy byłby wybrany jeden z elementów: nazwa lub biura, ale gdyby w firmie były dwa, to weryfikacja nie przeszłaby pomyślnie. Można też zauważyć, że w pracowniku znajduje się słowo PUSTY - oznacza to, że element musi być pusty. Jest też ANY – dowolne elementy. #PCDATA – dane tekstowe. ATTLIST Służy do dodawania atrybutów do elementów. Po ATTLIST następuje nazwa żądanego elementu, a po nim słownik w postaci „nazwa atrybutu - typ atrybutu”, a na końcu można dodać #IMPLIED (opcjonalne) lub #REQUIRED (wymagane). CDATA – dane tekstowe. Istnieją inne typy, ale wszystkie są pisane małymi literami. ENTITY ENTITY służy do deklarowania skrótów i tekstu, który będzie na nich umieszczony. Tak naprawdę będziemy mogli po prostu używać w formacie XML zamiast pełnego tekstu samej nazwy jednostki ze znakiem & przed i ; Po. Na przykład: aby rozróżnić znaczniki HTML od samych znaków, lewy nawias ostry często jest poprzedzony znakiem lt; , wystarczy umieścić & przed lt. Wtedy nie będziemy używać znaczników, a po prostu symbol <. Jak widać wszystko jest dość proste: deklarujesz elementy, wyjaśniasz, jakie elementy mogą zawierać zadeklarowane elementy, dodajesz atrybuty do tych elementów i, jeśli chcesz, możesz dodać encje, aby skrócić niektóre wpisy. I tu należałoby zadać pytanie: jak wykorzystać nasze reguły w naszym pliku XML? W końcu po prostu zadeklarowaliśmy reguły, ale nie używaliśmy ich w formacie XML. Istnieją dwa sposoby wykorzystania ich w XML: 1. Osadzanie - zapisanie reguł DTD wewnątrz samego pliku XML, wystarczy wpisać element główny po słowie kluczowym DOCTYPE i ująć nasz plik DTD w nawiasy kwadratowe.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE company [
        <!-- Объявление возможных элементов -->
        <!ELEMENT employee EMPTY>
        <!ELEMENT employees (employee+)>
        <!ELEMENT office (employees)>
        <!ELEMENT offices (office+)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT company (name, offices)>

        <!-- Добавление атрибутов для элементов employee и office -->
        <!ATTLIST employee
        name CDATA #REQUIRED
        job  CDATA #REQUIRED
        >

        <!ATTLIST office
        floor CDATA #REQUIRED
        room  CDATA #REQUIRED
        >

        <!-- Добавление сущностей -->
        <!ENTITY M "Maksim">
        <!ENTITY I "Ivan">
        <!ENTITY F "Franklin">
]>

<company>
    <name>IT-Heaven</name>
    <!-- Iwan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="&M;" job="Middle Software Developer" />
                <employee name="&I;" job="Junior Software Developer" />
                <employee name="&F;" job="Junior Software Developer" />
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer" />
                <employee name="Adam" job="Middle Software Developer" />
                <employee name="Leroy" job="Junior Software Developer" />
            </employees>
        </office>
    </offices>
</company>
2. Import - wszystkie nasze reguły zapisujemy w osobnym pliku DTD, po czym w pliku XML stosujemy konstrukcję DOCTYPE z pierwszej metody, tylko zamiast nawiasów kwadratowych należy napisać SYSTEM i podać ścieżkę bezwzględną lub względną do bieżąca lokalizacja pliku.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE company SYSTEM "dtd_example1.dtd">

<company>
    <name>IT-Heaven</name>
    <!-- Iwan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="&M;" job="Middle Software Developer" />
                <employee name="&I;" job="Junior Software Developer" />
                <employee name="&F;" job="Junior Software Developer" />
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer" />
                <employee name="Adam" job="Middle Software Developer" />
                <employee name="Leroy" job="Junior Software Developer" />
            </employees>
        </office>
    </offices>
</company>
Możesz także użyć słowa kluczowego PUBLIC zamiast SYSTEM, ale jest mało prawdopodobne, że będzie dla ciebie przydatne. Jeśli jesteś zainteresowany, możesz przeczytać o tym (i o SYSTEMIE) szczegółowo tutaj: link . Teraz nie możemy używać innych elementów bez zadeklarowania ich w DTD, a cały XML podlega naszym regułom. Możesz spróbować napisać ten kod w IntelliJ IDEA w oddzielnym pliku z rozszerzeniem .xml i spróbować dodać kilka nowych elementów lub usunąć element z naszego DTD i zauważyć, jak IDE będzie sygnalizować błąd. Jednak DTD ma swoje wady:
  • Ma własną składnię, różniącą się od składni XML.
  • DTD nie sprawdza typu danych i może zawierać tylko ciągi znaków.
  • W DTD nie ma przestrzeni nazw.
O problemie własnej składni: musisz zrozumieć dwie składnie na raz: składnię XML i składnię DTD. Są różne i to może wprowadzić Cię w zakłopotanie. Z tego powodu trudniej jest śledzić błędy w dużych plikach XML w połączeniu z tymi samymi schematami DTD. Jeśli coś nie działa, musisz sprawdzić ogromną ilość tekstu z różnymi składniami. To jakby czytać dwie książki jednocześnie: po rosyjsku i angielsku. A jeśli Twoja znajomość jednego języka jest gorsza, zrozumienie tekstu będzie równie trudne. O problemie sprawdzania typów danych: atrybuty w DTD mają różne typy, ale wszystkie w swej istocie są reprezentacją czegoś w postaci ciągów znaków, list lub łączy. Nie można jednak wymagać samych liczb, a zwłaszcza dodatnich lub ujemnych. I możesz całkowicie zapomnieć o typach obiektów. Ten ostatni problem zostanie omówiony w następnym artykule, który zostanie poświęcony przestrzeniom nazw i schematom XML, gdyż omawianie go tutaj nie ma sensu. Dziękuję wszystkim za uwagę, włożyłem w to mnóstwo pracy i nadal to robię, aby cały cykl artykułów zakończyć w terminie. Zasadniczo muszę po prostu rozgryźć schematy XML i wymyślić ich wyjaśnienie jaśniejszymi słowami, aby zakończyć drugi artykuł. Połowa jest już gotowa, więc można się tego spodziewać już niedługo. Ostatni artykuł będzie w całości poświęcony pracy z plikami XML przy użyciu języka Java. Życzę wszystkim powodzenia i sukcesów w programowaniu :) Następny artykuł: [Konkurs] Podstawy XML dla programisty Java - część 2 z 3
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION