Kurs ASP
Użycie 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 Explicite %>
<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.
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.MapPaht("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) |
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 ).
Autor: Krzysztof Stelmach
Artykuł ze strony: http://www.asp.z.pl/
|