r06 01


Rozdział 1 f& Pierwsze kroki (Nagłówek strony)
Komentarz: u autora 8
Rozdział 6.
XML i wiązanie danych
W poprzednim rozdziale zajmowaliśmy się przetwarzaniem dokumentów w Internet Explorerze
przy pomocy modelu DOM. Używaliśmy metod takich, jak firstChild, lastChild,
lastSibling i tak dalej. Użycie tych metod pozwoliło sięgnąć do wszystkich danych
dokumentu XML, ale traktowanie tego dokumentu jako drzewa węzłów było mylące, szczególnie
jeśli zapomni się, że dane znakowe elementów także mają własne swoje węzły.
Dokumenty XML można jednak w Internet Explorerze obsługiwać też inaczej, tym właśnie
zajmiemy się w tym rozdziale. Internet Explorer umożliwia odczytywanie dokumentów HTML
i XML i przechowywanie ich w bazie danych. Używając metod bazy danych, które omówimy
w tym rozdziale, możemy przechodzić między rekordami danych, co dla wielu programistów jest
łatwiejsze od stosowania metod DOM.
Wiązanie danych w Internet Explorerze
W Internet Explorerze rozwinięto koncepcję wiązania danych. Wiązanie to umożliwia łączenie
danych z dokumentów z bazą danych ADO (ActiveX Data Object) i pózniej łatwy dostęp do tych
danych. Taka technika pracy jest wygodna, gdyż dane z bazy można wysyłać jako dokumenty
XML przez Internet i w miejscu przeznaczenia można je przekształcić z powrotem. Dzięki temu
programiści, którym nieobce są zagadnienia baz danych, mogą skoncentrować się na dobrze
znanych sobie technikach, a nie muszą uczyć się metod DOM.
Najpierw ogólnie omówimy wiązanie danych w Internet Explorerze, pózniej zajmiemy się
konkretnie dokumentami XML. Użycie wiązania danych w Explorerze składa się z dwóch etapów:
najpierw używa się obiektów danych zródłowych (DSO, data source objects), potem dane wiąże
się z elementami HTML strony sieciowej.
Więcej informacji o wiązaniu danych
Więcej informacji o wiązaniu danych w Internet Explorerze znajdziesz pod adresem
http://msdn.microsoft.com/workshop/c-frame.htm#/workshop/author/default.asp.
C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 1
2 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)
Użycie obiektów danych zródłowych
W Internet Explorerze istnieją cztery obiekty danych zródłowych (DSO, Data Source Object):
kontrolka Microsoft HTML (MSHTML), kontrolka danych tabelarycznych (TDC), XML DSO
i wyspy danych XML. Internet Explorer obsługuje jeszcze dość wyspecjalizowany RDS DSO
(DSO dostępu zdalnego do danych), który umożliwia połączenie się z aplikacjami bazodanowymi,
takimi jak aplikacje SQL uruchamiane na serwerze sieciowym). Dwa DSO, mianowicie XML
DSO i wyspy danych XML, umożliwiają obsługę dokumentów XML.
DSO na stronie nie są widoczne (choć, jak zobaczymy pod koniec tego rozdziału, XML DSO
może wyświetlać na stronie komunikaty o stanie). DSO używa się do odczytywania dokumentu
i udostępniania jego danych reszcie strony. Aby DSO był w stanie odczytać dane dokumentu, dane
te muszą być odpowiednio sformatowane.
Poniżej przedstawiono dokument przykładowy, klient.html, który zawiera dane dotyczące
sprzedaży detalicznej. Rejestrujemy nazwiska i identyfikatory klientów, daty zakupu, dział,
z którego towar kupiono oraz nazwę towaru. Zwróć uwagę, jak za pomocą znaczników
określono strukturę dokumentu, aby dane były czytelne dla Internet Explorera (można by użyć też
innego znacznika, na przykład
). Każdemu znacznikowi z danymi przypisano atrybut ID,
który określa rodzaj danych. Jak widać, stosowana technika aż się prosi o zapis w postaci XML.


<br> Dane o klientach <br>


Nazwisko: Charles

ID: 58704

Data zakupu: Data:
2001.10.15


Dział: Mięso

Produkt: Szynka

Nazwisko: Franklin

ID: 58705

Data zakupu: Data:
2001.10.15


Dział: Warzywa

Produkt: Pomidory

Nazwisko: Phoebe

ID: 58706

Data zakupu: Data:
2001.10.15


Dział: Mięso

Produkt: Indyk

Nazwisko: Mark

ID: 58707

Data zakupu: Data:
2001.10.15


Dział: Mięso

Produkt: Wołowina

2 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)
Nazwisko: Nancy

ID: 58708

Data zakupu: Data:
2001.10.15


Dział: Mrożonki

Produkt: Brokuły



Najbardziej typowym sposobem obsługi danych sformatowanych w postać dokumentu HTML jest
użycie DSO MSHTML, tego obiektu tutaj użyjemy. DSO odczytuje dokument taki jaki pokazano
wyżej i przekształca go na zbiór rekordów. Każdy rekord z tego zbioru pochodzi z elementów
HTML lub XML, których użyto do przechowywania danych. Oto przykładowy rekord HTML:
Nazwisko: Charles

ID: 58704

Data zakupu: Data:
2001.10.15


Dział: Mięso

Produkt: Szynka

Rekord ten ma pięć pól: NAZWISKO, ID_KLIENTA, DATA_ZAKUPU, DZIAA i PRODUKT. Zbiór
rekordów wygląda jak tablica rekordów  kiedy pracujesz z konkretnym rekordem, możesz sięgać
do jego poszczególnych pól. Aby na przykład sprawdzić, co kupił Charles, wystarczy odnalezć
opisujący go rekord i sprawdzić wartość jego pola PRODUKT.
Używając znacznika można utworzyć obiekt DSO MSHTML i powiązać go z plikiem
klient.html. Obiekt ten nazwiemy dsoKlient:


DSO odczyta i zinterpretuje plik klient.html, przekształci go na zbiór danych ADO (tak naprawdę
Internet Explorer używa zbioru tylko do odczytu, ADOR). DSO zawiera na raz dane jednego tylko
rekordu, rekord ten jest rekordem bieżącym. Do nawigacji po zbiorze można używać
wbudowanych metod obiektu DSO, najpopularniejsze z nich to moveFirst, moveLast,
moveNext i movePrevious  odpowiednio: skok do pierwszego rekordu, skok do rekordu
ostatniego, następny i poprzedni rekord. Aby wyświetlić dane z DSO, trzeba je powiązać
z elementami HTML.
Wiązanie danych z elementami HTML
Tak naprawdę niewiele elementów HTML w Internet Explorerze obsługuje właściwości, które
umożliwiają wiązanie danych z DSO. Do wiązania używa się atrybutów DATASRC i DATAFLD.
Atrybut DATASRC jako wartość otrzymuje nazwę obiektu DSO, natomiast DATAFLD  nazwę
pola danych, które ma być związane z elementem, wtedy element HTML wyświetli dane
z bieżącego rekordu. Stosując metody moveFirst, moveLast, moveNext i movePrevious
można pokazać pozostałe rekordy ze zbioru.
Jeśli na przykład powiążemy pole tekstowe z DSO dsoKlient z polem danych NAZWISKO,
kontrolka przy pierwszym załadowaniu danych wyświetli napis Charles. Wywołanie metody
moveNext spowoduje, że rekordem bieżącym stanie się drugi rekord ze zbioru, a w polu
tekstowym wyświetlony zostanie napis Franklin.
C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 3
4 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)
Oto zestawienie elementów HTML z wyszczególnieniem, co daje ustawienie atrybutów DATASRC
i DATAFLD:
Element Co jest wiązane z danymi
A
Właściwość href; niemożliwa jest modyfikacja
danych.
APPLET
Właściwość param; modyfikacja danych jest możliwa.
BUTTON
Właściwość value; niemożliwa jest modyfikacja
danych.
DIV
Właściwości innerText oraz innerHTML;
niemożliwa jest modyfikacja danych.
FRAME
Właściwość src; niemożliwa jest modyfikacja danych.
IFRAME
Właściwość src; niemożliwa jest modyfikacja danych.
IMG
Właściwość src; niemożliwa jest modyfikacja danych.
INPUT TYPE=BUTTON
Właściwość value; niemożliwa jest modyfikacja
danych.
INPUT TYPE=CHECKBOX
Właściwość checked; możliwa jest modyfikacja
danych.
INPUT TYPE=HIDDEN
Właściwość value; możliwa jest modyfikacja danych.
INPUT TYPE=PASSWORD
Właściwość value; możliwa jest modyfikacja danych.
INPUT TYPE=RADIO
Właściwość checked; możliwa jest modyfikacja
danych.
INPUT TYPE=TEXT
Właściwość value; możliwa jest modyfikacja danych.
LABEL
Właściwość value; niemożliwa jest modyfikacja
danych.
MARQUEE
Właściwości innerText i innerHTML; niemożliwa
jest modyfikacja danych.
OBJECT
Właściwość objects; możliwa jest modyfikacja
danych.
PARAM
Właściwość param; możliwa jest modyfikacja danych.
SELECT
Właściwość text opcji; możliwa jest modyfikacja
danych.
SPAN
Właściwości innerText i innerHTML; niemożliwa
jest modyfikacja danych.
TABLE
Tworzy całą tabelę; niemożliwa jest modyfikacja
danych.
4 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)
TEXTAREA
Właściwość value; możliwa jest modyfikacja danych.
Oprócz tego znaczniki HTML mają zdarzenia, których można użyć przypadku wiązania ich
z danymi:
Zdarzenie Opis
onafterupdate Zachodzi po aktualizacji danych elementu w DSO.
onbeforeunload
Zachodzi przed usunięciem strony z pamięci.
onbeforeupdate
Zachodzi przed aktualizacją danych elementu w DSO.
onerrorupdate
Zachodzi, jeśli dane DSO nie zostały zaktualizowane
z powodu błędu.
Czas teraz całą tę naszą wiedzę zaprząc do pracy. Zaczniemy od dodania na stronie kontrolki
MSHTML dsoKlient i połączenia tego obiektu DSO z plikiem klient.html:


<br> Wiązanie danych za pomocą DSO MSHTML <br>




Wiązanie danych za pomocą DSO MSHTML


HEIGHT="0" WIDTH="0">

.
.
.
Teraz nasz obiekt DSO powiążemy z polem tekstowym ustawiając atrybut DATASRC tego pola
na wartość #dsoCutomer (Explorer wymaga poprzedzenia nazwy DSO krzyżykiem hash). Pole
tekstowe może wyświetlić jednocześnie dane tylko z jednego pola danych, wskażemy pole
NAZWISKO  użyjemy atrybutu DATAFLD:


<br> Wiązanie danych za pomocą DSO MSHTML <br>




Wiązanie danych za pomocą DSO MSHTML


HEIGHT="0" WIDTH="0">

Nazwisko: DATAFLD="NAZWISKO" SIZE="10">
C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 5
6 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)
.
.
.
Teraz pole danych ID_KLIENTA powiążemy z następnym polem tekstowym. Zresztą dane z DSO
można byłoby także wyświetlać bezpośrednio na stronie, bez używania pól tekstowych 
należałoby obiekt DSO powiązać z elementem SPAN, jak to robimy z datą zakupu:


<br> Wiązanie danych za pomocą DSO MSHTML <br>




Wiązanie danych za pomocą DSO MSHTML


HEIGHT="0" WIDTH="0">

Nazwisko: DATAFLD="NAZWISKO" SIZE="10">


ID: DATAFLD="ID_KLIENTA" SIZE="5">


Data zakupu: DATAFLD="DATA_ZAKUPU">
.
.
.
Aby pokazać sposób wiązania z danymi innych kontrolek, pole DZIAA powiążemy z kontrolką
SELECT, której odpowiada lista rozwijalna. DSO wskazujemy jak zwykle, ale trzeba też podać
wszystkie dopuszczalne wartości tego pola za pomocą wewnętrznych elementów OPTION:


<br> Wiązanie danych za pomocą DSO MSHTML <br>




Wiązanie danych za pomocą DSO MSHTML


HEIGHT="0" WIDTH="0">

Nazwisko: DATAFLD="NAZWISKO" SIZE="10">


ID: DATAFLD="ID_KLIENTA" SIZE="5">


6 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)
Data zakupu: DATAFLD="DATA_ZAKUPU">


Dział:


Produkt:

.
.
.
Niejako przy okazji powiązaliśmy jeszcze pole danych PRODUKT z kolejnym elementem SPAN.
Przy pierwszym załadowaniu strony pokazane zostaną wszystkie dane pierwszego rekordu
ze zbioru danych  jak jednak pokazać pozostałe dane?
Trzeba udostępnić użytkownikowi metody moveFirst, moveLast, moveNext
i movePrevious, aby mógł poruszać się po zbiorze rekordów; najwygodniej będzie powiązać te
metody z przyciskami. Do obiektu zbioru rekordów z DSO można się odwoływać stosując zapis
dsoKlient.recordset, zatem przesunięcie się do pierwszego rekordu realizowane metodą
moveFirst będzie wyglądało tak: dsoKlient.recordset.moveFirst(). Oto przyciski,
jakich użyjemy:
Opis przycisku Funkcja
<<
Przejście do pierwszego rekordu.
<
Przejście do poprzedniego rekordu.
>
Przejście do następnego rekordu.
>> Przejście do ostatniego rekordu.
Kod obsługi tych przycisków będzie wyglądał następująco:




Zanim jednak metod movePrevious i moveNext użyjemy, warto sprawdzić, czy rekordy
poprzedni i następny w ogóle istnieją (jeśli przesuniemy się poza koniec zbioru rekordów, pokażą
się puste pola). Można użyć właściwości BOF (początek zbioru danych) oraz EOF (koniec zbioru
danych) obiektu recordset. Gotowy kod będzie wyglądał tak:


<br> Wiązanie danych za pomocą DSO MSHTML <br>


C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 7
8 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)



Wiązanie danych za pomocą DSO MSHTML


HEIGHT="0" WIDTH="0">

Nazwisko: DATAFLD="NAZWISKO" SIZE="10">


ID: DATAFLD="ID_KLIENTA" SIZE="5">


Data zakupu: DATAFLD="DATA_ZAKUPU">


Dział:


Produkt:









Wynik działania tej strony pokazano na rysunku 6.1. Jak widać, wyświetlane są dane z pliku
klient.html; użytkownik może poruszać się po rekordach przy pomocy przycisków.
8 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)
Rysunek 6.1.
Wiązanie danych
w Internet
Explorerze
Tyle ogólnie o wiązaniu danych i o HTML; czas zająć się tym, co tygrysy lubią najbardziej, czyli
XML.
XML i wiązanie danych
Zaczniemy od przekształcenia pliku klient.html na XML. W HTML musieliśmy używać
elementów SPAN z atrybutem ID, w XML po prostu tworzymy potrzebne nam elementy. Nasze
dane jako XML uzyskają postać:



Charles
58704

2001.10.15
Mięso
Szynka


Franklin
58705
2001.10.15
Warzywa
Pomidory


Phoebe
58706
2001.10.15
Mięso
Indyk


C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 9
10 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)
Mark
58707
2001.10.15
Mięso
Wołowina


Nancy
58708
2001.10.15
Mrożonki
Brokuły


Jak widać, każdemu rekordowi odpowiada jeden element KLIENT. Można zresztą użyć dowolnej
nazwy elementów, Internet Explorer i tak będzie w stanie przetworzyć dane. W poprzednim
przykładzie, kiedy mieliśmy dane w postaci HTML, jako DSO używaliśmy kontrolki MSHTML,
teraz mamy do wyboru wyspy danych XML lub DSO XML oparty na specjalnym aplecie
dostarczanym wraz z Explorerem. Zaczniemy od użycia wysp danych.
Wiązanie pojedynczych rekordów przy użyciu
Komentarz: W.D.: Powinno
wyspa danych XML
być: wysp danych.
Aby zobaczyć sposób wiązania elementów HTML z wyspami danych XML, utworzymy nową
stronę HTML, w której będziemy czytać dane z pliku klient.xml:


<br> Wiązanie pojedynczych rekordów przy użyciu wysp danych XML <br>


10 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)


ID:


Data zakupu:


Dział:


Produkt:

.
.
.




Właściwości, metody i zdarzenia DSO XML
W przykładzie z początku tego rozdziału pokazano, jak można użyć metod zbioru rekordów,
takich jak moveFirst, moveLast, moveNext i movePrevious do poruszania się po tym
zbiorze. Teraz wszystkie dostępne właściwości, metody i zdarzenia omówimy bardziej
systematycznie. Zaczniemy od właściwości obiektu DSO XML:
Właściwość Opis
absolutePage
Strona, na której jest bieżący rekord.
absolutePosition
Położenie bieżącego rekordu w zbiorze.
BOF
Ma wartość true, jeśli rekordem bieżącym jest
pierwszy rekord.
cacheSize
Liczba rekordów ze zbioru znajdujących się lokalnie
w pamięci podręcznej.
cursorLocation
Położenie kursora w zbiorze rekordów.
cursorType
Rodzaj użytego kursora bazy danych.
editMode
Wskazuje, czy przeprowadzana jest edycja.
EOF
Ma wartość true, jeśli rekord bieżący znajduje się
za ostatnim rekordem zbioru.
lockType
Rodzaj użytego blokowania w bazie danych.
maxRecords
Dopuszczalna liczba rekordów, jaka może zostać
zwrócona przez zapytanie.
pageCount
Liczba stron danych znajdujących się w zbiorze
rekordów.
C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 11
12 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)
pageSize
Liczba rekordów składających się na jedną stronę.
recordCount
Liczba rekordów w zbiorze.
state
Stan zbioru rekordów (otwarty lub zamknięty).
status
Status bieżącego rekordu.
stayInSync
Wskazuje, czy hierarchiczny zbiór rekordów ma być
cały czas związany ze zródłem danych.
Obiekty DSO XML zawierają następujące metody:
Metoda Opis
addNew
Dodaje do zbioru nowy rekord.
cancel
Odwołuje żądanie wykonania oczekującego żądania
Execute lub Open.
cancelUpdate
Odwołuje żądanie aktualizacji danych.
clone
Tworzy kopię zbioru rekordów.
close
Zamyka zbiór rekordów.
delete
Usuwa bieżący rekord (lub grupę rekordów).
find
Przeszukuje zbiór rekordów (jednak Internet Explorer
nie obsługuje jeszcze składni języka SQL).
getRows
Odczytuje rekordy i zapisuje je w tablicy.
getString
Pobiera zbiór rekordów w postaci napisu (tekstu).
move
Zmienia pozycję bieżącego rekordu.
moveFirst, moveLast, Umożliwiają poruszanie się po zbiorze rekordów.
moveNext,
movePrevious
nextRecordSet
Zeruje bieżący obiekt zbioru danych i zwraca zbiór
następny. Metoda używana w przypadku
hierarchicznych zbiorów rekordów.
open
Otwiera bazę danych.
requery
Ponownie uruchamia zapytanie tworzące zbiór danych.
save
Zapisuje bieżący zbiór rekordów w pliku.
supports
Wskazuje, jakie możliwości udostępnia zbiór danych.
Konieczne jest przekazanie wartości typu long
odpowiadającej zmiennym metodom ADO zgodnie
z dokumentacją Microsoft ADO. Na przykład
przekazanie wartości 0x1000400 (0x oznacza zapis
szesnastkowy) zwróci true, aby poinformować, że
zbiór danych udostępnia metodę addNew. Przekazanie
12 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)
0x10000 da w wyniku false, gdyż zbiory danych
nie zawierają metody updateBatch.
Z obiektami DSO XML związane są różne zdarzenia  przypomnij sobie, jak pokazywaliśmy
w poprzednim rozdziale obsługę zdarzeń związanych z ładowaniem dokumentów XML.
Zdarzenie Opis
onDataAvailable Zachodzi przy każdym ładowaniu zestawu danych.
onDatasetChanged
Zachodzi przy każdej modyfikacji zbioru danych.
onDatasetComplete
Zachodzi, kiedy zbiór danych zostanie załadowany
i gotów jest do użycia.
onReadyStateChange
Zachodzi, kiedy zmienia się wartość właściwości
ReadyState.
onRowEnter
Zachodzi, kiedy inny rekord niż dotąd staje się
rekordem bieżącym.
onRowExit Zachodzi podczas opuszczania bieżącego rekordu.
onRowsDelete
Zachodzi przy usuwaniu rekordu.
onRowsInserted
Zachodzi przy wstawianiu rekordu.
onCellChange Zachodzi, kiedy dane kontrolki związanej ze zbiorem
się zmieniają, a kursor opuszcza daną komórkę.
Aby umożliwić użytkownikowi nawigację po zbiorze rekordów utworzonych z pliku klient.xml,
dodamy te same przyciski, które znamy już z przykładu HTML i znów użyjemy metod typu
klienci.recordset.moveNext() do nawigacji po tym zbiorze:


<br> Wiązanie pojedynczych rekordów przy użyciu wysp danych XML <br>



ID:


Data zakupu:


Dział:


Produkt:









Wynik naszej pracy można obejrzeć na rysunku 6.2: wartości pól danych zostały umieszczone
w elementach HTML. Klikając przyciski nawigacyjne użytkownik może poruszać się po zbiorze
danych.
Rysunek 6.2.
Użycie wiązania
danych
do wyświetlania
dokumentu XML
Jak wynika z pokazanych wcześniej tabel, istnieje znacznie więcej możliwości nawigowania
po zbiorze danych niż ich tu wykorzystaliśmy. Często na przykład wygodnie jest sięgać
do pojedynczych pól rekordu. Załóżmy, że chcemy określić wartość pola ID_KLIENTA
bieżącego rekordu DSO. Można to osiągnąć stosując wyrażenie
klienci.recordset("ID_KLIENTA").
Zapewne zauważyłeś, o ile łatwiej jest sięgać do danych przez pola zbioru danych niż przez użycie
metod DOM typu nextChild czy lastSibling. Jeśli dokument XML traktować jako bazę
danych, użycie zbioru rekordów znakomicie upraszcza życie programisty.
14 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)
Teraz pokażemy na przykładzie, jak sięgać do poszczególnych pól rekordów. Zorganizujemy pętlę
działającą na kolejnych rekordach bazy danych (skorzystamy z pętli while, warunkiem
zakończenia będzie uzyskanie przez właściwość EOF wartości true). Wyświetlać będziemy
nazwisko klienta, kupiony towar i dział, w którym dokonano zakupu. Oto kod:


<br> Dostęp do poszczególnych pól <br>






Dostęp do poszczególnych pól





ONCLICK="viewData()">





Wyniki działania tego kodu pokazano na rysunku 6.3. Jak widać, zestawione i wyświetlone zostały
poszczególne pola z różnych rekordów.
C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 15
16 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)
Rysunek 6.3.
Dostęp
do pojedynczych
pól
Jak dotąd mieliśmy dostęp do pojedynczych rekordów ze zbioru, można jednak oglądać od razu
dane z całego dokumentu XML  dane te należy wstawić do tabeli.
Tabelaryczne wiązanie danych XML
Kiedy wiążesz zbiór danych z tabelą HTML, w tabeli tej umieścić można cały ten zbiór. Oto
przykład  w tabelę wstawimy dane z pliku klient.xml. Zaczniemy od utworzenia wysp danych
XML z identyfikatorem customers:


<br> Tabelaryczne wiązanie danych - wyspy danych XML <br>




Tabelaryczne wiązanie danych - wyspy danych XML



.
.
.
Rekord z pliku klient.xml zawiera pola NAZWISKO, ID_KLIENTA, DATA_ZAKUPU, DZIAA
i PRODUKT. Pola te powiążemy z poszczególnymi komórkami tabeli w taki oto sposób:


<br> Tabelaryczne wiązanie danych - wyspy danych XML <br>




Tabelaryczne wiązanie danych - wyspy danych XML





Nazwisko
ID klienta
Data zakupu
Dział
Produkt

























Wyniki pokazano na rysunku 6.4; dane z pliku klient.xml zostały wyświetlone w postaci tabeli.
C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 17
18 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)
Rysunek 6.4.
Wiązanie danych
z tabelą w Internet
Explorerze
Istnieje jeszcze jeden obiekt DSO, którego można użyć do dokumentów XML w Internet
Explorerze  DSO XML.
Wiązanie pojedynczych rekordów za pomocą DSO
XML
Poczynając od wersji 4 Internet Explorera Microsoft włączył DSO XML przeznaczony
do korzystania z XML. Obiekt ten jest nieco dziwny, gdyż nie jest wewnętrznym obiektem
Explorera, ale jest apletem Javy. Aplet ten można włączać w stronę i obiekt DSO XML tworzyć
w elemencie APPLET:
CODE="com.ms.xml.dso.XMLDSO.class"
ID="IDENTYFIKATOR"
WIDTH="0"
HEIGHT="0"
MAYSCRIPT="true">


Stosując znacznik przekazujemy apletowi parametr, stosując zaś atrybut ID znacznika
określamy nazwę DSO.
W następnym przykładzie użyjemy DSO XML łącząc go z plikiem klient.xml. Aby powiązać nasz
plik XML z elementami HTML, zaczniemy od dodania apletu XML do strony sieciowej 
wywołamy DSO dsoKlient i przekażemy mu jako parametr adres URL dokumentu:


<br> Wiązanie pojedynczych rekordów przy pomocy DSO XML <br>




18 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)
Wiązanie pojedynczych rekordów przy pomocy DSO XML


CODE="com.ms.xml.dso.XMLDSO.class"
ID="dsoKlient"
WIDTH="0"
HEIGHT="0"
MAYSCRIPT="true">


.
.
.
To już właściwie wszystko. DSO udostępnia obiekt zbioru danych tak, jak to się dzieje
w przypadku wysp danych XML, możemy zatem wiązać elementy HTML tak, jak poprzednio:


<br> Wiązanie pojedynczych rekordów przy pomocy DSO XML <br>




Wiązanie pojedynczych rekordów przy pomocy DSO XML


CODE="com.ms.xml.dso.XMLDSO.class"
ID="dsoKlient"
WIDTH="0"
HEIGHT="0"
MAYSCRIPT="true">


Nazwisko: DATAFLD="NAZWISKO" SIZE="10">


ID: DATAFLD="ID_KLIENTA" SIZE="5">


Data zakupu: DATAFLD="DATA_ZAKUPU">


Dział:


Produkt:

.
.
.
C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 19
20 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)
Można znowu użyć metod obiektu zbioru danych, takich jak moveNext, do poruszania się
między rekordami; metody te znowu możemy powiązać z przyciskami:


<br> Wiązanie pojedynczych rekordów przy pomocy DSO XML <br>




Wiązanie pojedynczych rekordów przy pomocy DSO XML


CODE="com.ms.xml.dso.XMLDSO.class"
ID="dsoKlient"
WIDTH="0"
HEIGHT="0"
MAYSCRIPT="true">


Nazwisko: DATAFLD="NAZWISKO" SIZE="10">


ID: DATAFLD="ID_KLIENTA" SIZE="5">


Data zakupu: DATAFLD="DATA_ZAKUPU">


Dział:


Produkt:









Komentarz: DOS XML u autora
Działanie tej strony pokazano na rysunku 6.5. Aplet DSO XML działa zgodnie z oczekiwaniami,
to pomyłka
ale w niczym nie zmienia to faktu, że aplet ten jest obiektem zewnętrznym względem Explorera,
20 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)
co sugeruje, że Microsoft wcześniej czy pózniej może porzucić dalszy jego rozwój na rzecz wysp
XML.
Rysunek 6.5.
Wiązanie
pojedynczych
rekordów
przy pomocy DSO
XML
Tak jak wyspy danych XML, tak i DSO XML można wiązać z tabelami.
Tabelaryczne wiązanie danych za pomocą DSO XML
Wiązać XML DSO z tabelami jest równie łatwo, jak wiązać z tabelami wyspy danych.
W poniższym przykładzie pokażemy, jak to działa. Powiążemy z tabelą dane z klient.xml,
wyświetlimy jednocześnie wszystkie pola poszczególnych rekordów:


<br> Wiązanie danych DSO XML z tabelami <br>




Wiązanie danych DSO XML z tabelami


ID="klienci
WIDTH="0" HEIGHT="0"
MAYSCRIPT="true">












C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 21
22 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)









Nazwisko ID klienta Data zakupu Dział Produkt














Teraz można już na rysunku 6.6 obejrzeć wyniki naszej pracy1.
Rysunek 6.6.
Wiązanie danych
DSO XML
z tabelą
1
Niestety, pojawiają się w tym przypadku kłopoty z polskimi literami, co widać na rysunku.
Niepoprawnie wyświetlone są polskie litery w tabeli z danymi, choć są już poprawne
w statycznym kodzie HTML. Co gorsza, nie są obsługiwane znaczniki zawierające polskie litery,
w naszym przypadku element DZIAA. Dlatego w kodzie stosujemy element DZIAL, taka sama
zmiana była oczywiście konieczna także w zródle danych, czyli w dokumencie klient.xml.
(przyp. tłum.)
22 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)
XML i dane hierarchiczne
Jedną z najciekawszych cech współczesnych baz danych jest możliwość tworzenia
hierarchicznych rekordów zbiorów, w których pojedyncze rekordy mogą zawierać całe zbiory
nowych rekordów. Dokumenty XML to idealny sposób zapisu takich hierarchicznych zbiorów,
gdyż bez problemu można zawierać jeden zestaw elementów w innym.
Oto przykład. Dodajemy do danych klientów z pliku klient.xml dane o dostawach i wszystko
zapisujemy w nowym dokumencie, dostawy.xml.



Charles

58704
2001.10.15
Mięso
Szynka

2001.10.20
7.90 zł


2001.10.25
5.80 zł




Franklin

58705
2001.10.15
Warzywa
Pomidory

2001.10.20
12.00 zł


2001.10.25
11.80 zł




Phoebe

58706
2001.10.15
Mięso
Indyk

2001.10.20
22.00 zł


2001.10.25
34.00 zł
C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 23
24 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)




Mark

58707
2001.10.15
Mięso
Wołowina

2001.10.20
15.80 zł


2001.10.25
27.90 zł




Nancy

58708
2001.10.15
Mrożonki
Brokuły

2001.10.20
7.90 zł


2001.10.25
11.80 zł




W pokazywanym przykładzie element REKORD zawiera dwa elementy DOSTAWA, a te z kolei
zawierają po jednym elemencie DATA i SUMA. Obiekt DSO nie może potraktować wielu tak
umieszczonych rekordów jako rekordu pojedynczego, gdyż spowodowałoby to powstanie
w jednym rekordzie kilku pól o tej samej nazwie. W Internet Explorerze można w takiej sytuacji
użyć hierarchicznego zbioru rekordów, w których każdemu elementowi DOSTAWA odpowiada
jeden podzbiór rekordów.
Powstaje zatem kwestia, jak w hierarchicznej bazie danych można się odwoływać do takich
podzbiorów? Jak na przykład odwołać się do elementów DOSTAWA zawartych w poszczególnych
elementach REKORD? Stosuje się odwołanie do nowego zbioru rekordów, na przykład
REKORD.DOSTAWA. Wyrażenie to oznacza odwołanie do zbioru rekordów będącego dzieckiem
elementów DOSTAWA.
Jak zwykle łatwiej wszystko to zrozumieć na przykładzie. Opiszemy powiązanie danych pliku
dostawy.xml z tabelą i wyświetlanie danych o poszczególnych dostawach. Zaczynamy
od powiązania tabeli z wyspą danych XML i wyświetlenia nazwisk klientów:


<br>24 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc <br> Rozdział 1 f& Pierwsze kroki (Nagłówek strony) <br> Użycie rekordów hierarchicznych w XML <br>




Użycie rekordów hierarchicznych w XML







.
.
.
Następnie wiążemy tabelę z polem REKORD bieżącego rekordu:


<br> Użycie rekordów hierarchicznych w XML <br>




Użycie rekordów hierarchicznych w XML








.
.
.
Aby w każdym rekordzie DOSTAWA wyświetlić pola DATA i SUMA, wiążemy wewnętrzną tabelę
ze zbiorem danych REKORD.DOSTAWA:


<br> Użycie rekordów hierarchicznych w XML <br>




Użycie rekordów hierarchicznych w XML



C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 25
26 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)











CELLPADDING="5"
DATAFLD="REKORD.DOSTAWA">








Data Wartość






W Internet Explorerze dane pokażą się w takiej postaci, jak na rysunku 6.7. Obok każdego
nazwiska podano daty i koszty poszczególnych dostaw  mamy hierarchiczne zestawy danych
pochodzących z XML.
Rysunek 6.7.
Wyświetlanie
hierarchicznych
zbiorów rekordów
w Internet
Explorerze
Obsługa danych hierarchicznych o zmiennej
długości
Pokazano już, jak DSO Internet Explorera obsługują hierarchiczne zbiory rekordów. Używane
przez nas podzbiory zawierały po dwa rekordy, ale taki przykład odbiega nieco od rzeczywistości.
26 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)
Zwykle podzbiory mogą mieć bardzo różną długość. Jak ma w takiej sytuacji zachować się DSO?
Przyjrzyj się następnemu dokumentowi, różnie.xml, w którym wewnętrzne zbiory mają od jednego
do trzech rekordów DOSTAWA:



Charles

58704
2001.10.15
Mięso
Szynka

2001.10.20
7.90 zł


2001.10.25
5.80 zł


2001.10.25
5.80 zł




Franklin

58705
2001.10.15
Warzywa
Pomidory

2001.10.20
12.00 zł




Phoebe

58706
2001.10.15
Mięso
Indyk

2001.10.20
22.00 zł


2001.10.25
34.00 zł




Mark

58707
2001.10.15
C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 27
28 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)
Mięso
Wołowina

2001.10.20
15.80 zł


2001.10.25
27.90 zł




Nancy

58708
2001.10.15
Mrożonki
Brokuły

2001.10.20
7.90 zł


2001.10.25
11.80 zł


2002.03.05
28800.00 zł




Tak naprawdę nie ma z tym problemu  oto strona, która pozwoli nam wyświetlić dane:


<br> Zbiory hierarchiczne zmiennej wielkości <br>




Zbiory hierarchiczne zmiennej wielkości














CELLPADDING="3"
DATAFLD="REKORD.DOSTAWA">

28 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)







Data Wartość






Wyniki pokazano na rysunku 6.8  każdy zbiór rekordów DOSTAWA wyświetlany jest prawidłowo
mimo różnej ich wielkości.
Rysunek 6.8.
Hierarchiczne
zbiory rekordów
w Internet
Explorerze
Ten sam wynik można by uzyskać stosując zamiast wysp danych XML aplet DSO XML:


<br> Zbiory hierarchiczne zmiennej wielkości <br>




Zbiory hierarchiczne zmiennej wielkości


ID="klienci
WIDTH="0" HEIGHT="0"
MAYSCRIPT="true">





C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 29
30 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)








.
.
.

Sprzedaż





Przeszukiwanie danych XML
Stosując zbiory rekordów można zrobić wiele ciekawych rzeczy, czym zresztą w tym rozdziale się
zajmowaliśmy. Na koniec jeszcze przyjrzymy się możliwością wyszukiwania specyficznych
danych w bazie danych. Będziemy wyszukiwać klienta, którego nazwisko pasować będzie
do podanych przez użytkownika warunków wyboru.
Zmodyfikujemy nasz plik klient.xml  dodamy drugiego klienta o nazwisku Nancy, aby upewnić
się, że zawsze  wyłapujemy wszystkie przypadki wystąpienia poszukiwanej danej. Nowy plik
będzie nazywał się wiele.xml:



Charles
58704
2001.10.15
Mięso
Szynka


Franklin
58705
2001.10.15
Warzywa
Pomidory


Phoebe
58706
2001.10.15
Mięso
Indyk


Mark
58707
2001.10.15
Mięso
30 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)
Wołowina


Nancy
58708
2001.10.15
Mrożonki
Brokuły


Nancy
58709
2001.10.15
Warzywa
Pomidory


Po przygotowaniu wyspy danych i powiązaniu jej z plikiem wiele.xml utworzymy nową funkcję
znajdzPasujace, która wyszukiwać będzie nazwisko klienta, który interesuje użytkownika.
Wprawdzie zbiory rekordów ADOR mają metodę find służącą do przeszukiwania baz danych,
ale warunki wyszukiwania podaje się tej metodzie w postaci wyrażenia SQL (język SQL jest
typowym językiem do obsługi baz danych), natomiast Internet Explorer takich wyrażeń nie potrafi
obsłużyć. Wobec tego utworzymy pętlę języka JavaScript, w której będziemy wyszukiwać
pasujące nazwiska klientów.
Użytkownik może podać nazwisko, które chce znalezć, w polu tekstowym  nazwiemy je text1.
Kiedy użytkownik kliknie przycisk, wywołana zostanie funkcja znajdzPasujace. Podane
przez użytkownika nazwisko zamienimy na małe litery (użyjemy metody toLowerCase obiektu
String), aby wynik wyszukiwania nie zależał od sposobu zapisania danych, wynik konwersji
zapiszemy w zmiennej szukajTego:


<br> Wyszukiwanie danych w bazach XML <br>



.
.
.
Aby sprawdzić, czy bieżące nazwisko pasuje do nazwiska poszukiwanego przez użytkownika,
użyjemy metody indexOf obiektu String. Metoda ta zwróci wartość 0 lub większą, jeśli napis
da się dopasować:


<br> Wyszukiwanie danych w bazach XML <br>



.
.
.
Teraz pozostaje już tylko wyświetlić pasujące rekordy przy pomocy elementu
, jak to
robiliśmy dotąd. Trzeba też dodać przycisk i pole tekstowe, aby użytkownik mógł z naszym
kodem się porozumieć:


32 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)
<br> Wyszukiwanie danych w bazach XML <br>






Wyszukiwanie danych w bazach XML



Szukane nazwisko:




ONCLICK="znajdzPasujace()">





Wyniki pokazano na rysunku 6.9  odnalezione zostały oba rekordy, które znalezione być
powinny.
C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 33
34 Część I f& Podstawy obsługi systemu WhizBang (Nagłówek strony)
Rysunek 6.9.
Wyszukiwanie
danych w bazach
danych XML
W tym przykładzie użyliśmy wysp danych, ale oczywiście równie dobrze do załadowania danych
z pliku wiele.xml można byłoby użyć apletu DSO XML. Tym razem pokażemy jeszcze jedną
cechę tego apletu: jak dotąd podawaliśmy zerową wysokość i zerową szerokość, ale przez to aplet
ten nie wyświetla wyników swojego działania, a wystarczyłoby przyznać mu nieco miejsca
na stronie:2


<br> Wyszukiwanie danych w bazach XML <br>





Wyszukiwanie danych w bazach XML
2
Pamiętać trzeba o braku obsługi polskich liter w przypadku Javy na Windows 98  konieczna
była korekta pliku XML (zmiana DZIAA na DZIAL) (przyp. tłum.)
34 C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc
Rozdział 1 f& Pierwsze kroki (Nagłówek strony)


ID="klienci
WIDTH="400" HEIGHT="50"
MAYSCRIPT="true">



Szukane nazwisko:




ONCLICK="znajdzPasujace()">





Wyniki pokazano na rysunku 6.10. Obiekt DSO XML wyświetlił komunikat o prawidłowym
załadowaniu pliku XML (Successfully loaded XML from...), tło apletu jest zielone,
gdyż nie wystąpił żaden błąd  gdyby jakiś się pojawił, pojawiłby się w aplecie jego komunikat3.
Rysunek 6.10.
Wyszukiwanie
danych w bazach
XML przy użyciu
DSO XML
I w ten oto sposób zakończyliśmy omawianie wiązania danych w Internet Explorerze.
3
Jeśli nie zmienisz znaczników na , to mimo poprawnego kodowania
polskich liter zgodnie z normą ISO 8859-2 tło apletu będzie czerwone i komunikat poinformuje
nas o wystąpieniu nieprawidłowego znaku. (przyp. tłum.)
C:\do przegrania\Książki w txt lub doc\xml - vademecum profesjonalisty\r06-01.doc 35


Wyszukiwarka

Podobne podstrony:
r06 01 (2)
r06 01
t informatyk12[01] 02 101
r11 01
2570 01
introligators4[02] z2 01 n
Biuletyn 01 12 2014
beetelvoiceXL?? 01
01
2007 01 Web Building the Aptana Free Developer Environment for Ajax

więcej podobnych podstron