wróc
Zdjęcie do: [XML] Podstawy, składnia i przestrzenie nazw w XML
ikona kalendarz 2015-06-03 22:19:00

[XML] Podstawy, składnia i przestrzenie nazw w XML

XML, czyli EXtensible Markup Language jest uniwersalnym językiem służącym do opisu danych przy pomocy znaczników. Od lat jest niekwestionowanym standardem jeżeli chodzi o zapisywanie zbiorów danych. Nie ma praktycznie języka, który nie posiadałby lub nie mógł posiadać implementacji XML-a. Czyni to XML-a językiem niesamowicie uniwersalnym, całkowicie niezależnym od danej platformy, architektury, czy rodzaju oprogramowania. Za pomocą XML-a komunikować się może praktycznie każdy z każdym i wszystko ze wszystkim, co jest zresztą powszechnie wykorzystywane - w końcu właśnie w tym celu ten język powstał. Kolejnym atutem XML-a jest jego prosta budowa oparta na znacznikach. Poza tym jest łatwiejszy w czytaniu dla człowieka niż np. JSON - nie stanowi żadnego problemu "przeczytanie" prostego dokumentu XML bez użycia żadnych parsujących narzędzi. W artykule tym po krótce omówimy sobie strukturę dokumentów XML, a w następnych artykułach przeanalizujemy tworzenie, odczyt i przetwarzanie dokumentów XML za pomocą PHP oraz Javascriptu. Definicja standardu Każdy dokument XML zaczynamy od definicji standardu XML dokumentu i podania kodowania znaków dla niego: [code]<?xml version="1.0" encoding="UTF-8"?>[/code] Możemy pominąć podawanie tych parametrów, przyjęte zostaną wtedy wartości domyślne, takie jak powyżej, jednakże przyjęło się, że podajemy taką definicję na początku każdego dokumentu. Przykład prostego dokumentu XML [code]<?xml version="1.0" encoding="UTF-8"?> <books category="fantasy">   <book>     <title>Hobbit</title>     <author>J.R.R. Tolkien</author>   </book>   <book>     <title>Wieża Jaskółki</title>     <author>Andrzej Sapkowski</author>   </book> </books>[/code] Znaczniki Struktura dokumentu opiera się na znacznikach, w których opisujemy poszczególne elementy. Znacznik taki ma postać: [code]<znacznik>jakaś zawartość</znacznik>[/code] Przykładowo, opisując tytuł książki, możemy opisać go znacznikiem: [code]<title>Pan Tadeusz</title>[/code] Każdy znacznik może posiadać atrybuty go opisujące, które definiujemy następująco: [code]<znacznik atrybut1="wartość1" atrybut2="wartość2" [...]>[/code] Przykładowo: [code]<person name="Jan Kowalski" age="28">[/code] Znaczniki można w sobie zagnieżdzać, tj. każdy znacznik może posiadać w sobie kolejne znaczniki. Mówimy wtedy, że znacznik położony wyżej jest rodzicem znacznika położonego niżej, a znacznik położony niżej w hierarchi jest dzieckiem znacznika, w którym się zawiera. Popatrzmy na przykład z książką: [code]<book>   <title>Pan Tadeusz</title>   <author>Adam Mickiewicz</author> </book>[/code] Znaczniki <title> i <author> są dziećmi znacznika <book> (zawierają się w nim), jednocześnie znacznik <book> jest tutaj ich rodzicem. Zagnieżdżać możemy oczywiście głębiej, popatrzmy na przykład: [code] <shop>   <books category="poemat">     <book>       <title>Pan Tadeusz</title>       <author>         <first_name>Adam</first_name>         <last_name>Mickiewicz</last_name>       </author>     </book>   </books> </shop>[/code] Składnia i restrykcje XML jest bardzo restrykcyjny jeśli chodzi o składnię: 1. W każdym dokumencie musi istnieć jeden nadrzędny, główny znacznik, w którym zawierać się będą pozostałe. Znacznik główny nazywamy korzeniem - ang. root. W przypadku powyżej takim root-em dokumentu jest <shop></shop>. 2. Wszystkie znaczniki muszą zostać zamknięte w odpowiedniej kolejności - tak jak zostały otwarte. Przykład niepoprawny: [code]<books>   <book>     <title>Pan Tadeusz</title>     <author>Adam Mickiewicz</author>   </books> </book>[/code] Przykład poprawny: [code]<books>   <book>     <title>Pan Tadeusz</title>     <author>Adam Mickiewicz</author>   </book> </books>[/code] 3. Wszystkie puste znaczniki, a więc takie które nie posiadają znacznika zamykającego: [code]<znacznik></znacznik>[/code] muszą zostać domknięte za pomocą: [code]<znacznik />[/code] 4. Nazwa znacznika może składać się ze znaków alfanumerycznych (litery a-z, A-Z, cyfry 0-9), nie powinna zawierać polskich znaków. W nazwie znacznika możemy użyć trzech znaków specjalnych: podkreślnika - _ myślnika - - i kropki - . 5. Pozostałe znaki specjalne są zabronione. Ponadto nazwa znacznika nie może rozpoczynać się od znaku specjalnego oraz od ciągu xml, XML, Xml i pozostałych konfiguracji słowa xml. 6. Wszystkie znaczniki HTML ujęte pomiędzy znaczniki XML muszą zostać zamienione na encje. 7. Nigdzie w dokumencie (poza otwieraniem i zamykaniem znaczników) nie wolno nam użyć znaków: < (lt) > (gt) & (ampersand) Musimy zamienić je na encje: < na &lt; > na &gt; & na &amp; 8. Wartości atrybutów podajemy zawsze w cudzysłowach lub apostrofach. 9. Komentarze w dokumencie XML umieszczamy podobnie jak w HTML-u: [code]<!-- komentarz -->[/code] 10. Wszystko to co ma nie być przetwarzane przez parser XML umieszczamy w bloku: [code]<![CDATA[ ... ]]>[/code] Walidacja Dokument XML przygotowany lub wygenerowany niepoprawnie nie zostanie sparsowany. W sieci istnieje cała masa stron oferujących sprawdzanie poprawności składni dokumentów XML, są to tzw. walidatory. Przykładowo jeden z nich: https://validator.w3.org/ - walidator oferuje możliwość sprawdzenia dokumentu XML po podaniu jego URL-a, pliku lokalnego lub dokumentu wklejonego bezpośrednio do formularza. A na tej stronie wygenerujemy sobie widok drzewka z dokumentu XML: http://codebeautify.org/xmlviewer Przestrzenie nazw Przestrzenie nazw (namespaces) zostały stworzone w celu zdefiniowania sposobu opisu znaczników, które mogą mieć różne znaczenie w zależności od typu elementu. Przykładowo - znacznik <title> może mieć jasno określone znaczenie dla danego typu elementu, ale dla innego typu może już oznaczać coś innego. Inny przykład: w jednym dokumencie może znaleźć się opis książki oraz opis faktury za nią. W obu przypadkach istnieć może znacznik <author>, tyle tylko, że w przypadku książki oznacza on autora książki, a w przypadku faktury osobę ją wystawiającą. Jak aplikacja przetwarzająca takiego XML-a ma teraz to odróżnić i nie stwierdzić, że osobą wystawiającą fakturę za "Pana Tadeusza" jest np. Adam Mickiewicz? Dlatego właśnie wprowadzono nazewnictwo oparte na przestrzeniach nazw. Kolejną korzyścią jest to, iż w jednym dokumencie możemy wykorzystać tyle przestrzeni ile tylko chcemy, tak więc przykładowy znacznik <title> wykorzystać możemy w jednym dokumencie w kilku różnych kontekstach - różnych dla każdej z przestrzeni nazw. Przestrzeń nazw z jakiej będziemy korzystać określamy za pomocą: [code]xmlns:PREFIX = "URI_DO_SPECYFIKACJI"[/code] gdzie: xmlns - to nazwa specjalnego atrybutu, którym określamy przestrzeń (xmlns to skrót od XML NameSpace) PREFIX - określa skróconą nazwę przestrzeni, czyli jej prefix, który dodawać będziemy później do znaczników URI_DO_SPECYFIKACJI - adres prowadzący do opisu danej przestrzeni nazw. W zasadzie może on nawet prowadzić do nikąd, choć wg zaleceń prowadzić powinien on do dokumentu opisującego daną przestrzeń. Przykładowa definicja przestrzeni nazw: [code]<b:book xmlns:b="http://books.com/ns">   <b:author>Adam Mickiewicz</b:author>   <b:title>Pan Tadeusz</b:title> </b:book>[/code] Jak widać korzystamy tutaj z trzech znaczników: <book> <author> <title> Każdy z nich deklarowany jest w przestrzeni nazw: [code]http://books.com/ns[/code] której skrótowym prefixem jest: [code]b[/code] Nazwę znacznika w danej przestrzeni definiujemy na zasadzie: [code]<PREFIX:ZNACZNIK>[/code] w naszym przykładzie: [code]<b:book> <b:author> <b:title>[/code] Należy tutaj pamiętać, że również i znaczniki zamykające muszą posiadać prefiksy przestrzeni nazw, o ile taki wystąpił w znaczniku otwierającym. Przestrzeń nazw obowiązuje od miejsca jej zadeklarowania, tak więc nie możemy najpierw użyć znaczników z danej przestrzeni, a dopiero później jej zadeklarować. Ponadto - przestrzeń nazw obowiązuje jedynie dla znacznika, w którym została określona oraz we wszystkich znacznikach w nim zawartych (bez względu na stopien zagnieżdżenia). Zdefiniowanie zatem przestrzeni w głównym elemencie dokumentu spowoduje, że przestrzeń będzie obowiązywać dla całego dokumentu, gdyż wszystkie pozostałe znaczniki się w nim zawierają. Można także stworzyć przestrzeń nazw domyślną dla wszystkich elementów zawierających. W przypadku takim nie musimy już podawać prefixa przestrzeni przy znacznikach dzieci. Deklaracja przestrzeni domyślnej odbywa się również bez podawania prefixu. Przykład: [code]<book xmlns="http://books.com/ns">   <author>Adam Mickiewicz</author>   <title>Pan Tadeusz</title> <book>[/code] W powyższym przykładzie wszystkie znaczniki zawarte pomiędzy <book></book> znajdują się domyślnie w przestrzeni nazw http://books.com/ns. Przestrzenie nazw mogą również dotyczyć atrybutów: [code]<b:book xmlns:b="http://books.com/ns" b:hardcover="yes">   <b:author>Adam Mickiewicz</b:author>   <b:title>Pan Tadeusz</b:title> </b:book>[/code] Jeśli dla danego znacznika nie jest zdefiniowana żadna przestrzeń nazw to mówimy, ze występuje on w domyślnej, globalnej przestrzeni nazw.
Przejdź do pełnego artykułu
ikona autor Autor
PHP Majster
PHP5, SQL, HTML5, CSS3, XML, JSON, SOAP, Apache2 - artykuły, tutoriale, porady, praktyczne zastosowania.
Przejdź do strony

Wykorzystujemy pliki cookies. Szczegóły znajdziesz w polityce prywatności