Praca z językiem XML

Transkrypt

Praca z językiem XML
252
Bazy danych
Praca z językiem XML
Bazy danych
253
Przegląd zagadnień
Przechowywanie danych w XML
Wybieranie danych z XML
Podsumowanie
Laboratorium
XML (ang. eXtensible Markup Language) jest językiem znaczników
(jak HTML), w którym to programista decyduje o tym, jaka będzie struktura
znaczników. W ostatnich latach XML zyskał ogromną popularność jako format
idealny do wymiany danych między aplikacjami, nośnik konfiguracji aplikacji,
format zapisu danych. Znajomość moŜliwości XML i standardów skojarzonych
jest dziś właściwie niezbędna nie tylko w pracy z bazami danych, ale równieŜ
z technologiami programistycznymi.
254
Bazy danych
Przechowywanie danych w XML
Format danych
Problem z rozmiarem
Walidacja
W dzisiejszym świecie informacja jest przechowywana w róŜnych
formatach. Jednym z dość często spotykanych formatów jest XML. Oznacza to,
Ŝe SZBD powinny oferować moŜliwość zapisu w swoich strukturach (w swoich
bazach danych) danych przemieszanych ze znacznikami XML.
Bazy danych
255
Format danych
KaŜdy SZBD oferuje bogaty zestaw typów danych. Wśród tych typów
moŜna znaleźć sporo typów przechowujących tekst. PoniewaŜ XML jest
formatem tekstowym, moŜe być przechowywany jako tekst. Ale typ danych,
który w bazach danych ma słuŜyć do przechowywania danych XML powinien
charakteryzować się czymś więcej niŜ tylko moŜliwością zapisu znaczników
i zaszytych w nich informacji.
Jedną z podstawowych właściwości dokumentu XML jest wymóg, który mówi,
Ŝe dokument XML musi być "well-formed". Oznacza to, Ŝe:
•
•
•
•
dokument ma jeden element główny (ang. root), w którym zawarte są
pozostałe elementy,
pojedynczy znacznik nie zawiera dwóch atrybutów o takiej samej
nazwie,
wartości atrybutów powinny znaleźć się w ogranicznikach
(cudzysłowy lub apostrofy),
znaczniki nie powinny się "zazębiać".
PoniŜszy listing ilustruje przykładowy poprawny dokument XML.
<panstwa>
<panstwo nazwa="Polska">
<stolica>Warszawa</stolica>
<obszar>312680</obszar>
<ludnosc>38456785</ludnosc>
<glowne_miasta>Wrocław</glowne_miasta>
<glowne_miasta>Gdańsk</glowne_miasta>
<glowne_miasta>Kraków</glowne_miasta>
<glowne_miasta>Poznań</glowne_miasta>
</panstwo>
<panstwo nazwa="Niemcy">
<stolica>Berlin</stolica>
<obszar>356910</obszar>
<ludnosc>81700000</ludnosc>
<glowne_miasta>Monachium</glowne_miasta>
</panstwo>
<panstwo nazwa="Czechy">
<stolica>Praga</stolica>
<obszar>78703</obszar>
<ludnosc>10300000</ludnosc>
</panstwo>
</panstwa>
Idealny format do przechowywania danych XML powinien zapewniać
automatyczną kontrolę poprawności zapisu danych.
256
Bazy danych
Problem z rozmiarem
Częstym problemem z przechowywaniem danych w formacie XML
jest zbyt mały rozmiar typów danych w SZBD. Dla przykładu, w systemie
Microsoft SQL Server 2000 standardowe typy danych pozwalają
przechowywać tylko do 8000 bajtów tekstu, zaś formaty niestandardowe nie
mogą być uŜywane do deklarowania zmiennych, przez co nie nadaje się do
przetwarzania danych zapisanych w formacie XML.
O wiele lepszym typem danych dysponuje następca wspomnianego systemu,
Microsoft SQL Server 2005, w którym zaimplementowano typ xml, który
pozwala zapisać do 2GB danych zapisanych w kontrolowanym formacie XML,
dla którego moŜna równieŜ określić strukturę walidowaną przez schematy XML
Schema.
Walidacja
Bardzo często struktura dokumentów XML jest w jednoznaczny
sposób określona przy pomocy innych standardów, takich jak XML Schema
czy DTD (and. Document Type Definition). Szczególnie XML Schema jest
doskonałym formatem opisującym struktury XML. Idealnie zatem byłoby,
gdyby SZBD umoŜliwiał wykorzystanie standardów walidujących XML do
kontroli struktury danych zapisywanych w bazach danych.
Bazy danych
257
Wybieranie danych z XML
XPath
XQuery
Indeksowanie danych przechowywanych w XML
Dokument XML jest swego rodzaju bazą danych. KaŜdy dokument
zapisany w tym formacie ma jednoznacznie określoną strukturę, która świetnie
pasuje do przechowywania zarówno danych relacyjnych (danych o strukturze
takiej, jaką mają relacyjne bazy danych), jak i danych obiektowych (danych
odwzorowujących struktury z programowania obiektowego).
Zdarza się, Ŝe dokumenty XML są pokaźne rozmiarowo, zaś uŜytkownikowi
zaleŜy na stosunkowo niewielkim fragmencie danych z ich struktury. Wynika
z tego, Ŝe typy danych, które miałyby słuŜyć do przechowywania danych XML
powinny udostępniać mechanizmy wyszukiwania danych.
258
Bazy danych
XPath
XPath jest standardem, który pozwala lokalizować w dokumencie
XML węzły, czyli elementy, atrybuty i tekst, jaki jest w elementach i atrybutach
przechowywany. Standard ten jest wykorzystywany między innymi
w dokumentach XSL (ang. eXtensible Stylesheet Language), które pozwalają
na transformacje dokumentów XML do dowolnych formatów tekstowych (np.
HTML). Dzięki XPath w dokumentach XSL programista moŜe zbudować
szablony transformacji dla kaŜdego węzła dokumentu XML.
W SZBD wyraŜenia XPath mogą być wykorzystywane przez róŜnego rodzaju
mechanizmy wyszukujące dane w kolumnach zapisanych jako XML.
XQuery
XQuery jest standardem, który został dość niedawno opracowany przez
konsorcjum W3C (konsorcjum to opracowało i rozwija takŜe standardy XML,
XML Schema, XSL, XPath i inne) we współpracy z producentami SZBD (m.in.
firmą Microsoft).
Siłą XQuery jest to, Ŝe oprócz wykorzystania moŜliwości XPath jako języka do
przeszukiwania dokumentów XML, standard ten oferuje takŜe szereg
mechanizmów programistycznych, takich jak pętle czy instrukcje sterujące, co
powoduje, Ŝe moŜna zaimplementować naprawdę zaawansowane wyszukiwania
danych.
I rzecz najwaŜniejsza, XQuery oferuje moŜliwość zagnieŜdŜenia składni
przeszukujących struktury XML w zapytaniach SQL. PoniŜszy listing ilustruje
proste zapytanie wykonane przy uŜyciu XQuery (przykład pochodzi z systemu
Microsoft SQL Server 2005).
DECLARE @x xml
SET @x = '<ROOT><a>111</a></ROOT>'
SELECT @x.query('/ROOT/a')
Indeksowanie danych przechowywanych w formacie XML
W przypadku duŜych porcji danych zapisanych w formacie XML
powstaje problem z optymalizacją procesu wybierania danych analogiczny jak
ten, który zazwyczaj istnieje w relacyjnych bazach danych. Dlatego teŜ SZBD
powinny oferować mechanizmy przyspieszające wyszukiwanie danych
przechowywanych w formacie XML.
Microsoft SQL Server 2005 oferuje specjalne typy indeksów, których zadaniem
jest usprawnienie procesu przeszukiwania danych zapisanych w formacie XML
w bazach danych. Indeksy te przyspieszają zarówno odnajdywanie zadanych
elementów, jak i elementów zawierających określone wartości.
Bazy danych
259
Podsumowanie
Przechowywanie danych w XML
Wybieranie danych z XML
Znajomość języka XML i standardów z nim stowarzyszonych jest
w dzisiejszych czasach niezbędna z punktu widzenia programowania. XML
znalazł tak wiele zastosowań, Ŝe trudno dziś wymienić platformę
programistyczną czy serwer baz danych, który by nie wykorzystywał tego
formatu do przechowywania czy przesyłania danych. I nic nie zapowiada, by ta
sytuacja uległa zmianie.
260
Bazy danych
Laboratorium
Bazy danych
261
Przechowywanie danych XML
Microsoft SQL Server 2005 pozwala na zapisywanie danych
w formacie XML w zmiennych lub kolumnach o typie danych xml, który
pozwala zapisać do 2GB danych w formacie znaczników.
Krok 1 - Tworzenie tabeli z kolumną typu XML
►
►
►
►
►
►
►
Zaloguj się do maszyny wirtualnej ZBD jako uŜytkownik
Administrator z hasłem P@ssw0rd.
Kliknij Start. Z grupy programów Microsoft SQL Server 2005
uruchom SQL Server Management Studio.
W oknie logowania kliknij Connect.
Kliknij w menu głównym programu Management Studio na File.
Kliknij Open - File.
Odszukaj plik C:\Labs\Lab13\XML.sql i kliknij Open.
Zaznacz kod, który tworzy tabelę Project, w której pojawia się
kolumna Description typu xml (patrz kod poniŜej).
USE AdventureWorks
GO
CREATE TABLE Project
(
ProjectID int IDENTITY(1,1) PRIMARY KEY,
Name nvarchar(50) NOT NULL,
Description xml NULL
)
GO
►
Wciśnij F5, aby uruchomić zaznaczony fragment kodu.
Krok 2 - Wstawienie danych XML
►
Zaznacz kod, który wstawia przykładowy wiersz do tabeli Project
(patrz kod poniŜej).
INSERT Project
VALUES (
N'My first project',
'<project codename="SQLZone">
<deadline>2006-09-01</deadline>
<price>30000</price>
<hours>400</hours>
</project>')
►
Wciśnij F5, aby uruchomić zaznaczony fragment kodu.
PowyŜszy kod wstawia do tabeli Project przykładowy rekord. Operacja
zakończy się powodzeniem.
262
Bazy danych
Krok 3 - Kontrola poprawności danych XML
►
Zaznacz kod, który prezentuje próbę wstawienia niepoprawnych
danych XML (patrz kod poniŜej).
INSERT Project
VALUES (
N'My second project',
'<project codename="Vixen">
<deadline>2006-12-31</deadline>
<price>50000</price>
<hours>500</hours>
</PROJECT>')
►
Wciśnij
F5,
aby
uruchomić
zaznaczony
fragment
kodu.
PowyŜszy kod spowoduje błąd. Błąd wynika z oznaczonego na
czerwono fragmentu kodu XML (XML rozróŜnia wielkość liter, zatem
w powyŜszym kodzie jest podjęta próba zamknięcia znacznika, który
nie został otwarty).
Siłą typu danych xml jest to, Ŝe dane przed wstawieniem do kolumny
tego typu są sprawdzane pod kątem dobrego formatowania kodu
XML. Dodatkowo tworząc kolumnę lub zmienną tego typu moŜna
określić schemat XSD (XML Schema), dzięki której wszystkie
wstawiane dokumenty lub fragmenty dokumentów XML będą musiały
mieć odpowiednią strukturę znaczników i atrybutów.
Bazy danych
263
Zapytania XQuery
W systemie Microsoft SQL Server 2005 zaimplementowano
zaawansowaną obsługę XML. Oprócz moŜliwości walidacji za pomocą XML
Schema, uŜytkownicy mają moŜliwość formatowania wyników zapytań
SELECT jako XML czy wyszukiwania fragmentów dokumentów XML za
pomocą języka XQuery i standardu XPath.
W tym ćwiczeniu zobaczysz przykładowe składnie formatujące wynik
zapytania SELECT do formatu XML oraz wybierające fragment dokumentu
XML za pomocą poleceń XQuery.
Krok 1 - Zapytanie zwracające dokument XML
►
►
►
►
►
►
►
Zaloguj się do maszyny wirtualnej ZBD jako uŜytkownik
Administrator z hasłem P@ssw0rd.
Kliknij Start. Z grupy programów Microsoft SQL Server 2005
uruchom SQL Server Management Studio.
W oknie logowania kliknij Connect.
Kliknij w menu głównym programu Management Studio na File.
Kliknij Open - File.
Odszukaj plik C:\Labs\Lab08\XQuery.sql i kliknij Open.
Zaznacz kod, który wykonuje zapytanie z klauzulą FOR XML
(patrz kod poniŜej).
USE AdventureWorks
GO
SELECT DepartmentID [@DepartmentID], Name [Name]
FROM HumanResources.Department
WHERE DepartmentID < 3
FOR XML PATH('Department'), ROOT('Departments')
►
Wciśnij
F5,
aby
uruchomić
zaznaczony
fragment
kodu.
PowyŜsze zapytanie jest przykładem zapytania SELECT z klauzulą FOR
XML i opcją PATH. Wynik jest określony w następujący sposób zapytanie wybiera z tabeli HumanResources.Department rekordy,
w kórych wartość w kolumnie Department ID jest mniejsza od 3, następnie
zwrócone dane są formatowane do XML w taki sposób, Ŝe cały wynik jest
ograniczony elementem <Departments>, zaś pojedynczy rekord jest
reprezentowany znacznikiem <Department>, w którym znajdują się:
atrybut DepartmentID oraz zagnieŜdŜony element Name.
Aliasy na kolumny w zapytaniu SELECT pozwoliły określić połoŜenie
danych i organizację znaczników oraz atrybutów.
Składni SELECT ... FOR XML oraz składni operujących na danych
w formacie XML jest znacznie więcej. W Books Online znajdziesz opis
następujących składni:
- FOR XML AUTO,
- FOR XML RAW,
- FOR XML EXPLICIT,
- funkcja OPENXML.
264
Bazy danych
Krok 2 - Zapytanie XQuery
►
Zaznacz kod, który wykonuje zapytanie XQuery (patrz kod poniŜej).
DECLARE @zmienna XML
SET @zmienna = (
SELECT
DepartmentID
[@DepartmentID], Name [Name]
FROM HumanResources.Department
WHERE DepartmentID < 3
FOR
XML
PATH('Department'),
ROOT('Departments')
)
SELECT @zmienna.query('
<SelectedDepartments>
{
for $i in /Departments/Department
return <Department>
{($i/Name)}
</Department>
}
</SelectedDepartments>')
►
Wciśnij F5, aby uruchomić zaznaczony fragment kodu.
PowyŜsze zapytanie jest przykładem uŜycia języka XQuery (funkcji query
dostępnej dla pól i zmiennych typu xml). Wynik zapytania z kroku 1
zostaje zapisany do zmiennej typu xml, a następnie na tej zmiennej
wykonane jest zapytanie za pomocą funkcji query. Funkcja ta wybiera
tylko element Name (czyli eliminuje z kodu XML atrybut DepartmentID)
i ogranicza wynik elementem SelectedDepartments.
Typ xml dysponuje szeregiem funkcji (metod), które słuŜą nie tylko do
wybierania podzestawów danych XML, ale takŜe do modyfikacji kodu
XML. Przykłady takich funkcji to: value(), query(), modify(), nodes().
Ich szczegółowy opis wraz z przykładami znajdziesz w Books Online.