1. Odczytanie dokumentu XML
XML, eXtensible Markup Language, jest odmianą języka, która w porównaniu do HTML nie posiada ograniczeń pod względem definiowania znaczników. W HTML znaczniki są na sztywno określone. Można określić własne znaczniki i stworzyć dokument, który służyłby do ściśle określonych celów. Do tej pory powstało wiele standardów, które bazują na XML, np:
- |
CDF, Chanel Definiton Format, |
- |
SMIL, Synchronized Multimedia Integration Language, |
- |
OFX, Open Financial Exchange, |
- |
OSD, Open Software Description Format. |
Oto przykład dokumentu XML:
1: 2: 3: |
<?xml version="1.0"?> <notatnik wlasciciel="Autor"> <wydarzenie> |
4: 5: |
|
<opis>Dzień urodzenia Moniki</opis> <data> |
6: 7: 8: |
|
|
<dzien>17</dzien> <miesiac>03</miesiac> <rok>1974</rok> |
9: |
|
</data> |
10: 11: |
</wydarzenie> <wydarzenie> |
12: 13: |
|
<opis>Dzień urodzin mamy</opis> <data> |
14: 15: 16: |
|
|
<dzien>2</dzien> <miesiac>08</miesiac> <rok>1958</rok> |
17: |
|
</data> |
18: 19: |
</wydarzenie> <wydarzenie> |
20: 21: |
|
<opis>Dzień Matki</opis> <data> |
22: 23: 24: |
|
|
<dzien>26</dzien> <miesiac>05</miesiac> <rok>2000</rok> |
25: |
|
</data> |
26: 27: |
</wydarzenie> </notatnik> |
Jak widać XML wyglądem jest zbliżony do HTML, posiada znaczniki otwierające i zamykające elementy oraz niektóre znaczniki posiadają atrybuty. Jedyną chyba różnicą jest to, że nazwy znaczników są tworzone przez samego autora tego dokumentu. Poniżej znajduje się opis przykładu. Linia pierwsza:
informuje przeglądarkę, że standardem bieżącego dokumentu jest XML 1.0, który w momencie pisania tego opisu był najbardziej rozpowszechnionym standardem XML. Podstawowym elementem dokumentu XML w powyższym przykładzie jest notatnik, który musi składać się ze znacznika początku i końca. Dokument bez tego podstawowego elementu, zwanego także węzłem podstawowym, jest niepoprawny. Posiada on także atrybut:
<notatnik wlasciciel="Autor"> |
Nazwa atrybutu to wlasciciel, jego wartość określa nazwę właściciela umieszczonych w dokumencie informacji. Oba elementy uzupełniają słownictwo tego dokumentu. Chociaż XML posiada inne rodzaje elementów (np. komentarze, instrukcje, itp.), tylko te dwie są niezbędne do tworzenia struktury dokumentu. Element podstawowy, notatnik, zawiera w sobie inne elementy, elementy potomne (podrzędne). W przykładzie są nimi wydarzenie, które zawiera opis wydarzenia wewnątrz znacznika opis oraz informację o dniu, miesiącu i roku danego wydarzenia, które zawarte są w elementach potomnych w stosunku do data. Podczas tworzenia elementów w XML należy uważać, aby nie zamknąć elementu nadrzędnego przed zamknięciem elementu potomnego.
Przedstawienie danych zawartych w dokumencie XML odbywa się poprzez interfejs DOM (Document Object Model). DOM jest potężnym interfejsem programistycznym, który może być użyty zarówno po stronie klienckiej jak i po stronie serwera. Poniższy przykład pokazuje jak można przetworzyć zawartość wcześniej zaprezentowanego dokumentu XML po stronie serwera używając ASP oraz DOM i wyświetlić go po stronie klienckiej w oknie przeglądarki w postaci zwykłego dokumentu HTML.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: |
<% @LANGUAGE = VBScript %> <% Option Explicit %> <HTML> <HEAD> <TITLE>Prezentacja zawartości pliku XML</TITLE> </HEAD> <BODY BGCOLOR="#FFFFFF"> <% Dim XMLDoc, rootNode, wydarzenie, element, i, strDataWydarzenia Set XMLDoc = Server.CreateObject("Microsoft.XMLDOM") XMLDoc.Async = False XMLDoc.Load(Server.MapPath("notatnik.xml")) Set rootNode = XMLDoc.documentElement Response.Write "<H1>Notatnik, własność: " Response.Write rootNode.attributes.getNamedItem("wlasciciel").text & "</H1>" & VbCrLf |
16: |
If rootNode.hasChildNodes() Then |
17: 18: |
|
For Each wydarzenie In rootNode.childNodes For Each element In wydarzenie.childNodes |
19: |
|
|
If element.nodeName = "opis" Then |
20: |
|
|
|
Response.Write "<B>" & element.Text & "</B><BR>" |
21: |
|
|
ElseIf element.nodeName = "data" Then |
22: 23: |
|
|
|
strDataWydarzenia = "" For i = 0 To element.childNodes.length - 1 |
24: |
|
|
|
|
strDataWydarzenia = strDataWydarzenia & element.childNodes(i).Text & "/" |
25: 26: |
|
|
|
Next strDataWydarzenia = Left(strDataWydarzenia, Len(strDataWydarzenia) - 1) & "<BR>" & VbCrLf |
27: |
|
|
|
Response.Write strDataWydarzenia |
28: |
|
|
End If |
29: 30: |
|
Next Next |
31: 32: 33: 34: |
End If %> </BODY> </HTML> |
Interfejs DOM jest dostępny poprzez obiekt Microsoft.XMLDOM, co ma miejsce w linii 10. Właściwość Async, która jest użyta w celu załadowania dokumentu XML, nie jest niezbędna w przypadku serwera, ale nie zaszkodzi, a nawet pomoże nie zapomnieć o jej ustawieniu w przypadku tworzenia XML po stronie klienckiej. W linii 12 metoda MapPath posiada parametr "notatnik.xml". Jest to nazwa pliku XML zawierająca wcześniej zaprezentowany przykładowy dokument XML. Pierwszy element w dokumencie XML, element podstawowy (najwyższego rzędu) jest pobierany poprzez instrukcję:
Set rootNode = XMLDoc.documentElement |
W przykładowym pliku XML jest to element notatnik, który posiada atrybut nazwany wlasciciel i jego zawartość jest znajduje się w
rootNode.attributes.getNamedItem("wlasciciel").Text |
Przed użyciem pętli pobierającej zawartość wszystkich elementów potomnych dla elementu notatnik użyta została instrukcja warunkowa If sprawdzająca obecność takich elementów w dokumencie (linia 16). Dopiero po sprawdzeniu warunku następuje wykonanie pętli For ... Each pobierającej wszystkie elementy potomne względem elementu notatnik (linia 17). Kolejna pętla (linia 18), również For ... Each, dotyczy pobrania elementów podrzędnych w stosunku do elementu wydarzenie. Wewnątrz pętli znajduje się warunek sprawdzający nazwę elementu podrzędnego. Odbywa się to poprzez wykorzystanie właściwości nodeName:
If element.nodeName = "name" Then |
|
... |
ElseIf element.nodeName = "data" Then |
|
... |
End If |
Zawartość elementów dokumentu XML znajduje się we właściwości Text danego elementu. Taka prezentacja zawartości dokumentu XML jest chyba najszybszą metodą. Innym sposobem jest wykorzystanie dokumentu XSL (eXtensible Stylesheet Language), który umożliwia twórcy opis wyglądu poszczególnych elementów na stronie WWW.
2. Wykorzystanie XSL
XSL może być użyty w celu przekształcenia dokumentu XML na dokument HTML. XSL nie tylko umożliwia definiowanie wyglądu, ale także selekcję, dokonywanie operacji oraz sortowanie danych. XSL definiuje szablon końcowy oraz określa w jaki sposób elementy źródłowe mają być przekształcone i w jaki sposób umieszczone w dokumencie HTML. Poniżej przedstawiony został przykładowy dokument XSL.
1: 2: |
<?xml version="1.0" encoding="ISO-8859-2"?> <HTML xmlns:xsl="http://www.w3c.org/TR/WD-xsl"> |
3: |
|
<BODY STYLE="font-family: Tahoma, Verdana, Arial; font-size: 12pt; background-color: #FFFFFF"> |
4: |
|
|
<DIV STYLE="font-weight: bold; font-size: 16pt"> |
5: |
|
|
|
Notatnik, własność: <xsl:value-of select="@wlasciciel"/> |
6: 7: |
|
|
</DIV> <xsl:for-each select="wydarzenie" order-by="+ opis"> |
8: |
|
|
|
<DIV STYLE="background-color: #44AAFF; color: #000000; padding: 2px"> |
9: |
|
|
|
|
<SPAN STYLE="font-weight: bold; color: weight"><xsl:value-of select="opis"/></SPAN> |
10: |
|
|
|
</DIV> |
11: |
|
|
<xsl:for-each select="data"> |
12: 13: |
|
|
|
<DIV STYLE="font-weight: bold"> <SPAN STYLE="font-weight: bold">Data: |
14: |
|
|
<xsl:value-of select="dzien"/>/<xsl:value-of select="miesiac"/>/<xsl:value-of select="rok"/></SPAN> |
15: 16: 17: |
|
|
</DIV> </xsl:for-each> </xsl:for-each> |
18: |
|
</BODY> |
19: |
</HTML> |
Podstawowy (nadrzędny) element dokumentu XML jest właściwie dostępny od samego początku, a jego atrybut jest umieszczony w linii 5:
<xsl:value-of select="@wlasciciel"/> |
Wartość atrybutu jest dostępna, ponieważ jego nazwa została poprzedzona znakiem @, który odróżnia nazwy atrybutów od nazw elementów. Nazwy elementów nie są poprzedzane żadnym znakiem. Należy zauważyć, że ten znacznik nie posiada znacznika końca elementu XSL. Jest to związane z tym, że każdy element XSL można zamknąć poprzez umieszczenie znaku / przed symbolem zamknięcia znacznika, tak jak jest to zrobione w linii 5. Przemieszczanie się po wydarzeniach (elementach potomnych w stosunku do elementu podstawowego) jest zrealizowane poprzez użycie:
<xsl:for-each select="wydarzenie" order-by="+ opis"> </xsl:for-each> |
Ciekawym elementem tej instrukcji jest to, że istnieje możliwość (i jest to zrobione) dokonania sortowania po elementach opis. Sortowanie jest rosnące, o czym świadczy znak "+" przed nazwą elementu. Umieszczenie znaku "-" spowodowałoby sortowanie malejące. Wewnętrzny element xsl:for-each (linie 11-16) dokumentu XSL wykonuje się w przypadku elementu podrzędnego w stosunku do elementu wydarzenia jakim jest data. Pozostałe znaczniki są identyczne jak w przypadku dokumentu HTML i nie będą omawiane w tej części.
Teraz kiedy stworzony został dokument XML oraz dokument XSL należałoby wykorzystać je w celu prezentacji zawartości pliku XML używając ASP. Oto przykład skryptu ASP:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: |
<% @LANGUAGE = VBScript %> <% Option Explicit %> <HTML> <HEAD> <TITLE>Przykład połączenia XML i XSL</TITLE> </HEAD> <BODY BGCOLOR="#FFFFFF"> <% Dim XMLDoc, XSLDoc Set XMLDoc = Server.CreateObject("Microsoft.XMLDOM") Set XSLDoc = Server.CreateObject("Microsoft.XMLDOM") XML.Async = False XMLDoc.Load(Server.MapPath("notatnik.xml")) XSLDoc.Async = False XSLDoc.Load(Server.MapPath("notatnik.xsl")) Response.Write(XMLDoc.documentElement.transformNode(XSLDoc.documentElement)) |
17: 18: 19: |
%> </BODY> </HTML> |
W liniach 10 i 11 zostały utworzone dwa obiekty XML DOM. Pierwszy ładuje notatnik, zaś drugi opis wyglądu dokumentu końcowego. Użycie opisu wyglądu z dokumentu XSL na danych zawartych w pliku XML odbywa się poprzez wywołanie metody:
XMLDoc.documentElement.transformNode(XSLDoc.documentElement) |
3. Tworzenie dokumentu XML
Istnieje możliwość stworzenia dokumentu XML poprzez wykorzystanie DOM oraz ASP. Oto przykład pokazujący w jaki sposób się to realizuje. Poniższy skrypt tworzy dokument XML zawierający tylko jeden element wydarzenie wraz z opisem i datą.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: |
<% Set XMLDoc = Server.CreateObject("Microsoft.XMLDOM")
' stworzenie elementu podstawowego i dołączenie go do dokumentu XML Set notatnik = XMLDoc.CreateElement("notatnik") Set atrWlasciciel = XMLDoc.CreateAttribute("wlasciciel") atrWlascicial.Text = "Autor" wydarzenie.attributes.setNamedItem(atrWlasciciel) Set XMLDoc.documentElement = notatnik
' dodanie wydarzenia Set wydarzenie = XMLDoc.CreateElement("wydarzenie") notatnik.AppendChild(wydarzenie) Set opis = XMLDoc.CreateElement("opis") opis.Text = "Dzień urodzin Moniki" wydarzenie.AppendChild(opis)
' dodanie daty wydarzenia Set data = XMLDoc.CreateElement("data") wydarzenie.AppendChild(data) Set dzien = XMLDoc.CreateElement("dzien") dzien.Text = "17" data.AppendChild(dzien) Set miesiac = XMLDoc.CreateElement("miesiac") miesiac.Text = "03" data.AppendChild(miesiac) Set rok = XMLDoc.CreateElement("rok") rok.Text = "1974" data.AppendChild(rok)
' wysłanie dokumentu do przeglądarki Response.Write "<?xml version=""1.0""?>" Response.Write notatnik.xml %> |
Pierwszym krokiem, jest oczywiście stworzenie obiektu XML DOM, który automatycznie stworzy dokument, ale nie stworzy elementu podstawowego - należy zrobić to samemu (linia 4). Następnie zapis:
Set atrWlasciciel = XMLDoc.CreateAttribute("wlasciciel") atrWlascicial.Text = "Autor" wydarzenie.attributes.setNamedItem(atrWlasciciel) |
tworzy atrybut dla elementu podstawowego i nadaje mu wartość "Autor". Element podstawowy jest dopiero dołączony do dokumentu XML w linii 8. Właściwość documentElement przechowuje element podstawowy. Pozostała część skryptu tworzy elementy wydarzenia i odpowiednio je podporządkowuje. Na uwagę zasługuje metoda AppendChild(), która umożliwia dodanie do dowolnego elementu jego podelementu, czyli elementu podrzędnego:
element.AppendChild(podelement) |
Tak utworzony cały dokument XML zostaje przekazany do klienta (przeglądarki) poprzez użycie komend:
Response.Write "<?xml version=""1.0""?>" Response.Write notatnik.xml |
które informują przeglądarkę o wersji dokumentu XML oraz wysyłają cały stworzony dokument XML. Stworzony dokument nie jest jeszcze tym co chciałoby się zaprezentować klientowi (użytkownikowi). Teraz należałoby stworzyć dokument HTML działający po stronie klienta.
1: 2: 3: 4: 5: 6: 7: 8: 9: |
<HTML> <HEAD> <TITLE>Połączenie XML i XSL w IE 5.0 - wykonywane po stronie klienta (przeglądarki)</TITLE> </HEAD> <BODY BGCOLOR="#FFFFFF"> <XML ID="XMLDoc"></XML> <XML ID="XSLDoc"></XML> <DIV ID="sformatowanyHTML"></DIV> <SCRIPT LANGUAGE = VBScript> |
10: 11: 12: 13: 14: |
|
XMLDoc.Async = False XMLDoc.Load("notatnik.asp") XSLDoc.Async = False XSLDoc.Load("notatnik.xsl") result = XMLDoc.documentElement.transformNode(XSLDoc.documentElement) |
15: |
|
sformatowanyHTML.innerHTML = result |
16: 17: 18: |
</SCRIPT> </BODY> </HTML> |
Wygląd jest bardzo podobny do przykładu (skryptu ASP) wykonywanego po stronie serwera. Przykładowe obiekty XML DOM dla plików XML i XSL są zdefiniowane w liniach 7 i 8 oraz znacznik DIV, który będzie przechowywał przekształcony dokument XML. W części skryptu ładowane są oba dokumenty XML oraz XSL, a następnie dokonuje się przekształcenie dokumentu XML, w taki sposób, jaki został opisany w XSL. Jedyną różnicą w porównaniu do skryptu wykonującego się po stronie serwera jest to, że rezultat zostanie zapisany wewnątrz znacznika DIV (instrukcja innerHTML). |