Waldemar Bartyna 1 Programowanie zaawansowane LINQ to XML
Waldemar Bartyna XML XML (ang. Extensible Markup Language) – rozszerzalny język znaczników – uniwersalny, formalny język przeznaczony do reprezentowania danych w strukturalizowany sposób. XML stał się standardem jako format, w jakim są przechowywane i przesyłane dane. Zapewnia całkowitą niezależność od platformy sprzętowej, programowej i systemu operacyjnego. 2
Waldemar Bartyna Wykorzystanie XML w.NET Pliki konfiguracyjne aplikacji przechowywane są w formacie XML, Typ DataSet w technologii ADO.NET pozwala na zapisanie i wczytanie w prosty sposób danych w postaci dokumentów XML, Windows Presenteation Fundation wykorzystuje gramatykę opartą na XML-u (XAML) do reprezentacji interfejsu graficznego. Windows Commucication Fundation (jak również oryginalne API zdalnych wywołań) jako sformatowane łańcuchy znaków (XML). 3
Waldemar Bartyna Specyfikacja W3C Mimo, że rzeczywiście XML jest powszechnie wykorzystywany, API do jego przetwarzania (zgodne ze specyfikacjami W3C) jest bardzo obszerne i złożone (DOM, SAX, XPath, XQuery, itd.). Również platforma.NET zapewnia swoją wersję API do przetwarzana XML w pakiecie System.Xml.dll. Jest ona zgodna ze specyfikacjami W3C (posiada również kilka swoich dodatków: modele XmlReader/XmlWriter). 4
Waldemar Bartyna LINQ to XML Tak jak LINQ to SQL integruje manipulowanie relacyjnymi bazami danych bezpośrednio z językiem programowania, tak LINQ to XML chce osiągnąć ten sam rezultat w stosunku do przetwarzania danych zapisanych w formacie XML. LINQ to XML pozwala na wydobycie podzbioru danych z istniejącego dokumentu XML za pomocą zapytań, Pozwala również na tworzenie, modyfikowanie i parsowanie XMLowych dokumentów. LINQ to XML może być postrzegany jako ”lepszy DOM”, LINQ to SQL może współpracować z typami z ADO.NET. Podobnie LINQ to XML może współpracować z wieloma składowymi pakietu System.Xml.dll. 5
Waldemar Bartyna Pakiet System.Xml.Linq Pakiet definiujący przestrzenie nazw związane z LINQ to XML to System.Xml.Linq. Jest on standardowo dołączany do każdego z nowo utworzonych projektów. Pakiet ten definiuje typy w trzech różnych przestrzeniach nazw: System. Xml.Linq - bazowa przestrzeń zawiera zbór typów reprezentujących różne aspekty dokumentu XML, System.Xml.Schema, System.Xml.Xpath. 6
Waldemar Bartyna Pakiet System.Xml.Linq (2) 7
Waldemar Bartyna „DOM-owe API” Utwórzmy dokument za pomocą API zgodnego z W3C DOM. 8
Waldemar Bartyna „DOM-owe API” c. d. 9
Waldemar Bartyna „DOM-owe API” c. d. (2) 10
Waldemar Bartyna „DOM-owe API” c. d. (3) 11
Waldemar Bartyna Wynikowy dokument XML 12
Waldemar Bartyna Definiowanie tego samego dokumentu za pomocą LINQ to XML. Nowe API (LINQ to XML) 13
Waldemar Bartyna Cechy nowego AIPI LINQ to XML, od strony porównania z DOM-owym API, różni się od niego w następujących aspektach: Konstrukcja drzewa XML, Najważniejszy jest element, nie dokument, Definiowanie przestrzeni nazw i prefiksów, Wydobywanie wartości węzłów. 14
Waldemar Bartyna Funkcyjne konstruowania drzewa XML W LINQ to XML do konstrukcji drzewa XML stosuje się nową technikę nazwaną konstrukcją funkcyjną. Pozwala ona na definiowanie schematu podczas konstruowania obiektów XML i inicjalizacji wartości. 15
Waldemar Bartyna Dokumenty nie są obowiązkowe W DOM API wymagane jest, aby każdy nowo utworzony element należał do obiektu dokumentu. W LINQ to XML nie ma takiego obowiązku. Możliwe jest tworzenie i przetwarzanie samych elementów (XElement). Oczywiście w razie potrzeby możemy również utworzyć dokument. 16
Waldemar Bartyna Nazwy, przestrzenie nazw i prefiksy Aby dodać przestrzeń nazw do nazwy elementu wystarczy utworzyć obiekt klasy XNamespace i powiązać go z wybraną nazwą. Można go również podać bezpośrednio w konstruktorze elementu. 17
Waldemar Bartyna Nazwy, przestrzenie nazw i prefiksy (2) Dodajmy przestrzeń nazw do naszego przykładu. 18
Waldemar Bartyna Nazwy, przestrzenie nazw i prefiksy (3) Zdefiniowana przestrzeń nazw jest dołączana jako domyślna przestrzeń nazw (bez definicji prefiksu). 19
Waldemar Bartyna Nazwy, przestrzenie nazw i prefiksy (4) Jeżeli chcemy zdefiniować prefiks, dodajemy go jako atrybut elementu. 20
Waldemar Bartyna Wydobywanie wartości węzła Aby wydobyć wartość węzła wystarczy go rzutować na odpowiedni typ. Jawne rzutowanie z węzła zostało zdefiniowane dla następujących typów: string, int, int?, uint, uint?, long, long?, ulong, ulong?, bool, bool?, float, float?, double, double?, decimal, decimal?, TimeSpan, TimeSpan?, DateTime, DateTime?, GUID, i GUID?. 21
Waldemar Bartyna Wydobywanie wartości węzła, przykład 22
Waldemar Bartyna Model obiektów LINQ to XML 23
Waldemar Bartyna Tworzenie dokumentu z zapytania LINQ 24
Waldemar Bartyna Parsowanie, zapisywanie i wczytywanie XMLa 25
Waldemar Bartyna Nawigowanie po dokumencie 26
Waldemar Bartyna Modyfikowanie dokumentu 27
Waldemar Bartyna Modyfikowanie dokumentu, przykład 2 28
Waldemar Bartyna Obsługa zdarzeń obiektów XML 29
Waldemar Bartyna Wykorzystanie LINQ 30
Waldemar Bartyna Dziękuję za uwagę 31