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.