Przejdź do zawartości

XML/Struktura

Z Wikibooks, biblioteki wolnych podręczników.
< XML

Wprowadzenie

[edytuj]

Najbardziej rozpowszechnioną interpretacją dokumentu XML jest drzewo. Jest tak, ponieważ każdy element może zawierać w sobie inny. W jaki sposób?

<rodzic>
    <dziecko>Węzeł tekstowy</dziecko>
</rodzic>

Powyższy przykład nawet sugeruje, jakie nazewnictwo jest używane. Faktycznie, dokument XML jest rozpatrywany jako drzewo genealogiczne ukorzenione. Zawsze istnieje jeden główny element, który zawiera w sobie inne. Jest on przodkiem wszystkich elementów. Każdy inny jest jego potomkiem, a te będące jego bezpośrednimi potomkami są dziećmi. Elementy bezpośrednio zawierające te dzieci są ich rodzicami. W świecie przetwarzania danych relację zawierania jednego elementu w drugim nazywa się agregacją. Można powiedzieć, że dany element agreguje (czyli zawiera w sobie) inne, czyli jest ich rodzicem/przodkiem. Zwróć uwagę na to, że element może w sobie zawierać bezpośrednio jednocześnie element, jak i tekst.

<korzeń>
    <element rodzic="a" przodek="wszystkich we wnętrzu a" dziecko="korzeń">
        <a rodzic="b" dziecko="a" potomek="korzeń, element" przodek="dziecko, x">
            <dziecko kogo="a" potomek="a, korzeń, element">Węzeł tekstowy <x></x></dziecko>
        </a>
    </element>
</korzeń>

Każdy element jest węzłem. Są nim także atrybuty czy węzły tekstowe, które są opisane w powyższych przykładach. Są nimi także komentarze, instrukcje przetwarzania, prolog i dosłownie wszystko, co jest częścią dokumentu XML.

Węzeł Opis Angielska nazwa Symbol relacji[1]
korzeń nadrzędny element root

:root

przodek element zawierający inny ancestor przodek potomek
potomek element będący w innym descedant przodek potomek
rodzic element bezpośrednio zawierający parent rodzic > dziecko

rodzic / dziecko

dziecko element bezpośrednio zawierany child rodzic > dziecko

rodzic / dziecko

węzeł każda część dokumentu node ---

Jak rozplanować strukturę?

[edytuj]

Język XML jest całkowicie rozszerzalny i tu nas dopada klęska urodzaju. Istnieje wiele różnych dróg do uzyskania tego samego rezultatu - dane mogą być reprezentowane jako elementy, atrybuty lub węzły tekstowe. Co wybrać?

Prześledźmy możliwości: element jest bardzo rozszerzalną strukturą - może zawierać w sobie elementy oraz atrybuty. Może zawierać dane niemal w dowolnej formie. Atrybut może zawierać tylko węzeł tekstowy. Ogólnie rzecz biorąc, jest jednym węzłem Węzeł tekstowy jest już ostateczną daną. Jest na końcu hierarchii z samej swojej istoty. I też jest jednym węzłem.

Wyjściowo można więc powiedzieć, że należy unikać stosowania atrybutów. Taka struktura:

<note>
    <from>Ela W.</from>
    <to>Maja S.</to>
    <body>To jest notatka. Nie zapomnij o niej!</body>
</note>

Jest na ogół uważana za lepszą, niż taka:

<note from="Ela W." to="Maja S." body="To jest notatka. Nie zapomnij o niej!" />

Każdy z rodzajów węzła jest jednak użyteczny. I struktura dokumentu jasno określa jaki węzeł określa jaki element. Atrybuty opisują element jako całość, natomiast nie są jego podelementami. Można spróbować określić, jakie dane odnoszą się do całej składowej, a jakie nie.

<note priority="important">
    <from>Ela W.</from>
    <to>Maja S.</to>
    <body>To jest notatka. Nie zapomnij o niej!</body>
</note>

Jak przygotować dane do przetwarzania?

[edytuj]

Aby odpowiedzieć na takie pytanie, musisz znać model systemu informatycznego, który będzie na dokumencie pracować. Przy składowaniu jakichś danych atomowych najlepiej je oddzielić od siebie.

<note priority="important" year="2017" month="2" day="1">
    <from>Ela W.</from>
    <to>Maja S.</to>
    <body>To jest notatka. Nie zapomnij o niej!</body>
</note>

W większości języków programowania, można operować na całej dacie jako jednej zmiennej i rozdzielanie składowych po to, by je łączyć, jest bezsensowne.

[edytuj]
<note priority="important" date="2017-02-01">
    <from>Ela W.</from>
    <to>Maja S.</to>
    <body>To jest notatka. Nie zapomnij o niej!</body>
</note>

A co, jeśli potrzebujemy osobno imię i nazwisko? Może warto przechowywać je w osobnych elementach? Na przykład w elemencie person? A może jako atrybuty elementu person? A jak adres e-mail? Czy opłaca się przechowywać adresy e-mail w postaci rozłożonej na użytkownika i domenę? Najczęściej nie. Ale każde rozwiązanie musi być zaplanowane oddzielnie wraz z deweloperem aplikacji. Wykracza to jednak poza zakres niniejszego kursu.

Dokument a baza danych

[edytuj]

Bardziej zaawansowanym przypadkiem jest rozmieszczenie elementów w całym pliku. Najbardziej powszechnymi rozwiązaniami są te do siebie opozycyjne: umiejscowienie zorientowane na dokument oraz umiejscowienie zorientowane na hierarchiczną strukturę następujących elementów po sobie. Pierwszy sposób jest stosowany do zapisywania dokumentów tekstowych. Przykładem może być XHTML, Office Open XML, OpenDocument. Drugi sposób pozwala budować różnego rodzaju dokumenty wymiany danych, a nawet hierarchiczne bazy danych. Za przykłady mogą posłużyć: RDF Schema albo XML Schema.

<html xmlns="http://www.w3.org/1999/xhtml">
    <head><title>Tytuł</title></head>
    <body>
        <article>
            <h1>Tytuł artykułu</h1>
            <p>To jest przykład struktury <abbr>XML</abbr> zorientowanej na <u>dokument</u>. Węzły różnego rodzaju i poziomu  ze sobą pomieszane.</p>
        </article>
    </body>
</html>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns"
	   xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema">
    <rdfs:Class rdf:ID="empty"></rdfs:Class>
    <rdfs:Class rdf:ID="one">
    	<rdfs:subClassOf rdf:resource="content" />
    </rdfs:Class>
    <!-- Jak widać, struktura tego pliku jest ściśle hierarchiczna. Węzły tekstowe, o ile występują, są na samym dole hierarchii. -->
</rdf:RDF>

Nic nie stoi na przeszkodzie ku temu, aby te rozwiązania łączyć. Dla zachowania przejrzystości można też użyć encji w miejsce dokumentu.

  1. Symbol relacji nie jest zapisany jako taki w XML, ponieważ XML nie zajmuje się obróbką danych. Pierwszy z lub jedyny symbol to selektor CSS, który jest używany np. w CSS i DOM. Drugi symbol to fragment ścieżki XPath.