• A po co akurat XML?
– Bo aplikacja potrafi takie dane od razu przetworzyć – Bo takie są wymagania biznesowe naszego klienta
– Bo system, z którym współpracujemy potrafi pracować tylko z danymi XML
– Bo łatwo takie dane potem przetworzyć na dowolna inna potrzebną postać (HTML, PDF, RTF, SVG …)
• Ok. Wiemy po co. Ale jak?
– Klauzula XML w zapytaniu SELECT:)
24
Klauzula FOR XML polecenia SELECT
• Dodana do dowolnego polecenia SELECT powoduje zwrócenie jego wyniku w formie dokumentu lub
fragmentu dokumentu XML
• Kilka trybów generowania XML – RAW
– AUTO
– EXPLICIT – PATH
• Tryby RAW i AUTO dają możliwość generowania wartości kolumn jako atrybutów lub elementów
• Tryby EXPLICIT i PATH dają największe możliwości – Tryb XPATH korzysta z wyrażeń języka XPath – Tryb EXPLICIT korzysta z tabeli uniwersalnej
25
Dane do obróbki – lista klientów
• W przykładowej bazie mamy tabelę z danymi klientów • Załóżmy, że chcemy zwrócić właśnie te dane. Nic
prostszego:
26
No tak. Ale potrzebujmy te dane w postaci XML!
• Nie ma problemu – skorzystamy z klauzuli FOR XML • Zaczniemy od najprostszego wariantu : FOR XML RAW
27
Oooops! To nie jest dokument XML!
• Klauzula FOR XML RAW zwróciła nam fragment dokumentu XML.
• Nie do końca nadaje się on do dalszej obróbki po
stronie aplikacji, gdyż żaden szanujący się parser nie przymknie oka na brak elementu głównego!
28
informatyka +
<dane>
Klauzula FOR XML RAW z opcją ROOT
• Oczywiście da się to poprawić
29
informatyka +
Klauzula FOR XML RAW z opcją ROOT
• Opcja RAW także dopuszcza podanie w nawiasie nazwy elementu
30
Klauzula FOR XML RAW z opcją ELEMENTS
• Aplikacja potrzebuje elementów a nie atrybutów! Co wtedy?
31
Klauzula FOR XML RAW to za mało !
• FOR XML Raw jest OK, ale potrzebujemy nieco więcej możliwości!
• Jak generować dokument XML z hierarchią elementów?
– Np.: lista klientów i ich zamówień
• Odpowiedź : klauzula FOR XML AUTO
– Domyślnie generuje dla wiersza element o nazwie takiej jak tabela
– Dla kolumn tworzone są atrybuty o nazwach takich jako kolumny
– Przeznaczona do zapytań operujących na wielu tabelach – Potrafi tworzyć proste hierarchie (heurystycznie poprzez analizowanie kolejnych wierszy i porównywanie wartości kolumn)
– Obsługuje wszystkie opcje omawiane przy FOR XML RAW
32
Klauzula FOR XML AUTO - przykład
33
informatyka +
Wpływa na hierarchię!
Klauzula FOR XML AUTO - przykład
34
informatyka +
Tym razem po ID zamówienia
Coraz więcej możliwości:) Co jeszcze da się zrobić?
35
informatyka +
• Da się zrobić wszystko. Kwestia czasu i nakładu pracy. • Do tej pory podejście do generowania XML polegało na:
– Dodaniu do DOWOLNEGO zapytania klauzuli FOR XML (AUTO lub RAW)
– Skorzystaniu z ich opcji do „dopracowania” postaci dokumentu
• Gdy to za mało – sięgamy po FOR XML EXPLICIT
– Specjalnie skonstruowane zapytanie – Złożona konstrukcja.
– Trudne modyfikowanie – Ogromne możliwości
Klauzula FOR XML EXPLICIT
36
informatyka +
• Największe możliwości w zakresie budowania złożonych struktur XML
• Precyzyjne wymagania co do struktury wyniku
zapytania, które ma być przetworzone na XML (tabela uniwersalna)
• Skomplikowany mechanizm definiowania tabeli
Klauzula FOR XML EXPLICIT
37
informatyka +
• Spróbujmy sklecić przykład (podobny do tego z trybu AUTO)
Klauzula FOR XML EXPLICIT
38
informatyka +
• Rezultat zapytania z poprzedniego slajdu (bez klauzuli FOR XML):
Klauzula FOR XML EXPLICIT
39
informatyka +
• Rezultat zapytania z poprzedniego slajdu (z klauzulą FOR XML):
Klauzula FOR XML EXPLICIT – fajna ale żmudna
40
informatyka +
• Jest jakiś sposób na uniknięcie jej stosowania?
• TAK:) Klauzula FOR XML PATH
– O wiele przyjemniejsza w stosowaniu – Porównywalne możliwości
– Łatwiejsze modyfikowanie (znacznie lepsza czytelność zapytań)
• Wady? A owszem…
Klauzula FOR XML PATH i język XPath
41
informatyka +
• Język XPath służy do wskazywania węzłów lub grup węzłów w dokumencie XML
• Wyrażenia XPath można porównać do ścieżek w systemie plików.
Wyrażenie: \dane\adres\pocztowy\ulica
Klauzula FOR XML PATH i język XPath
42
informatyka +
Wyrażenie: /dane/adres/pocztowy/ulica
wskazuje na element ulica i jego zawartość.
<dane> <adres> <email> <wartosc>jan.nowak@pocza.pl</wartosc> </email> </adres> <adres> <pocztowy> <kodPocztowy>00-950</kodPocztowy> <miejscowosc>Warszawa</miejscowosc> <ulica>Marszałkowska</ulica> <budynek>23</budynek> <lokal>1</lokal> </pocztowy> </adres> </dane>
Klauzula FOR XML PATH i język XPath
43
informatyka +
• Przykłady wyrażeń XPath
• /dane/adres/email[2]/wartosc
– Element „wartosc” drugiego elementu „email” będącego
dzieckiem elementu „adres”, będacego dzieckiem elementu głównego „dane”
– Elementy „email” występujące w dowolnym miejscu w dokumencie
• //adres/*/@typ
– Atrybuty „@typ” dowolnych elementów będących dziećmi elementu „adres”
• /dane/adres/*[@typ=‘skype’]/text()
– Zawartośc tekstowa dowolnego elementu, który ma atrybut „typ” o wartości „skype”, będącego dzieckiem elementu adres,
Klauzula FOR XML PATH
44
informatyka +
• Kompromis pomiędzy możliwościami a prostotą korzystania
• Znacznie łatwiejsza od EXPLICIT
• Pozwala na definiowanie złożonych struktur przy wykorzystaniu odpowiednich nazw kolumn
(przypominających wyrażenia XPath)
• Pozwala na zagnieżdżanie zapytań i uzyskiwanie tą droga złożonej struktury XML
• Istotna jest kolejność kolumn (najpierw te definiujące atrybuty, potem kolejne elementy)
• Możliwość wykorzystania znaku * (gwiazdka) jako nazwy kolumny
Klauzula FOR XML PATH
45
informatyka +
• Obsługuje opcje znane z trybu RAW i AUTO
• Istotna jest kolejność kolumn w zapytaniu (najpierw atrybuty, potem elementy)
Klauzula FOR XML PATH
46
informatyka +
Opcja TYPE!