XML - ćwiczenia 2 - modelowanie

Patryk Czarnik

Utworzono: 2002.10.12

Zmodyfikowano: 2002.10.15

Kodowanie znaków

"Wewnętrznie" dokumenty XML są zapisane w zestawie znaków określonym przez standard Unicode (unicode.org). Do plików mogą być zapisywane w różnych standardach kodowania znaków, podczas odczytywania i zapisywania aplikacje dokonują konwersji.
Każda aplikacja wspomagająca XML musi obsługiwać standard UTF-8 - kodowanie zestawu Unicode, w którym znaki o kodach od 0 do 128 są zapisywane jako jeden bajt i są zgodne z ASCII, a pozostałe kody zajmują do czterech bajtów. Większość oprogramowania XML-owego obsługuje też jednobajtowe standardy ISO-8859-X oraz UTF-16.

Aby określić w jakim zestawie znaków zapisany jest dany dokument, należy w deklaracji XML podać parametr encoding, na przykład tak:

<?xml encoding="ISO-8859-2"?>

Jeśli parametr nie występuje, przyjmuje się, że dokument jest zapisany w UTF-8 lub UTF-16.

Jak umieszczać niedopuszczalne znaki

W dokumentach XML niektóre znaki są traktowane w specjalny sposób, np. < oznacza początek znacznika, wewnątrz znacznika nie można użyć >, a wewnątrz wartości atrybutu niedopuszczalne są " albo '. Jeśli chcemy zapisać dokument w uboższym zestawie znaków trzeba też móc zapisać znaki spoza tego zestawu.
Można się w tym celu posłużyć encjami i referencjami do znaków.
Encje predefiniowane:

Referencje do znaków: &#numer-znaku; pozwalają na zakodowanie dwolnego znaku z zestawu Unicode. numer-znaku to liczba zapisana dziesiętnie lub kod szesnastkowy poprzedzony znakiem x. Na przykład &#38; (&#x26;).

Do umieszczenia w dokumencie fragmentu, który ma nie być przetwarzany jak XML, tylko traktowany jako napis, służy sekcja CDATA.

...<![CDATA[tekst nieprzetwarzany: x >=0 && x < 100 itp.]]>...

Uwaga! Wewnątrz sekcji CDATA nie może znajdować się ciąg znaków ]]> - zawsze zamyka on sekcję. Przyjęto też, że nie można umieszczać tej kombinacji znaków jawnie w dokumencie (zamiast tego można napisać ]]&gt;).

Encje

Encja to zadeklarowany obiekt, który zawiera napis, fragment dokumentu... Encja ma swoją nazwę i wartość. Aby można użyć danej encji, trzeba ją zadeklarować w DTD (nie dotyczy to pięciu encji predefiniowanych). Procesor XML powinien traktować dokument tak jakby w miejsce referencji do encji wstawił ich wartości.

Referencja do encji ogólnej w dokumencie ma postać &nazwa_encji; i może wystąpić poza DTD, natomiast deklaracja w DTD:
<!ENTITY nazwa-encji wartość-encji>
Może być wiele deklaracji encji o tej samej nazwie, liczy się pierwsza.
Wartość encji może być podana bezpośrednio w deklaracji ujęta w znaki " " lub ' ', wtedy encję nazywamy wewnętrzną. Można też zadeklarować encję zewnętrzną - jest to uogólnienie pliku, jakiś zasób dostępny dla procesora XML. W praktyce chodzi o plik zapisany lokalnie lub plik/zasób adresowany przez URI.
Do identyfikacji encji zewnętrznej służy identyfikator systemowy lub identyfikator publiczny. Domyślnie encja po wstawieniu jest przetwarzana jako XML, powinna być poprawnym fragmentem XML (jeśli jest znacznik otwierający, powinien być zamykający itp.), ponadto może zaczynać się od deklaracji analogicznej do deklaracji XML, podającej wersję XML i kodowanie (np. <?xml version="1.0" encoding="UTF-8"?>). Jeśli chcemy aby pozostała nieprzetwarzana, należy napisać NDATA notacja - notacja powinna być zadeklarowana w DTD. Encja nieprzetwarzana może w dokumencie występować tylko jako wartość atrybutu typu ENTITY (ENTITIES).

<!ENTITY open-hatch
         SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY open-hatch
         PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN"
         "http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY hatch-pic
         SYSTEM "../grafix/OpenHatch.gif"
         NDATA gif >

Encje parametryczne to specjalny rodzaj encji, do których referencje pojawiać się mogą wewnątrz DTD. Referencja ma postać: %nazwa_encji;, natomiast deklaracja:
<!ENTITY % nazwa-encji wartość-encji>
Encje parametryczne też mogą być wewnętrzne i zewnętrzne, ale nie ma nieprzetwarzanych. Encje parametryczna i ogólna o tej samej nazwie są różnymi obiektami, mogą istnieć obok siebie.
Wszystkie encje muszą być zadeklarowane przed jakimkolwiek odwołaniem do nich (także jako wartości domyślnej atrybutu).

Notacje

Deklaracja notacji w DTD: <!NOTATION nazwa-notacji ID>

<!NOTATION GIF SYSTEM "ACDSee.exe"
<!NOTATION GIF PUBLIC "-//GIF.COM//Gif//EN" "ACDSee.exe"
<!NOTATION GIF PUBLIC "-//GIF.COM//Gif//EN"

Zastosowanie notacji:

Sekcje warunkowe

<![ INCLUDE [ fragment DTD ]]>
<![ IGNORE [ fragment DTD ]]>
W połączeniu z encjami parametrycznymi stanowią mechanizm do tworzenia sparametryzowanych DTD.

Zadania

  1. Zapisz fragment DTD opisujący znane z HTML elementy dla list ol, ul, li. Załóżmy, że body może zawierać tekst z zanurzonymi w nim listami, listy tylko elementy wypunktowania (li), a elementy wypunktowania znowu tekst z zanurzonymi listami. W każdym miejscu gdzie dopuszczalny jest tekst, może być on znakowany elementami font z atrybutami size i face.
  2. Zmień napisane wcześniej DTD tak, aby dokumenty napisane do poprzedniej wersji dalej się walidowały, natomiast nowe z pewną drobną dodatkową informacją były zgodne z nowy standardem, w którym nie ma elementów font, a są span z atrybutem style.
Zadania autorstwa Szymona Zioło

źródło w XML