#16 LINQ to XML

LINQ to XML

Aby wyjaśnić na czym polega technologia LINQ to XML na początku trzeba zgłębić trochę teorii na temat tego języka. LINQ to XML to kolejna technologia LINQ, która opiera się na odczycie i zapisie plików XML. XML z angielskiego Extensible Markup Language, czyli rozszerzalny język znaczników służy do prezentowania danych w uporządkowany sposób. Zaletą tego języka jest to, że jest on niezależny od platformy systemowej. Pliki które będziemy tworzyć za pomocą XML-a są plikami tekstowymi.

Zasada tworzenia treści plików w XML przypomina troszeczkę HTML. Języki te sa podobne z uwagi na wykorzystywanie znaczników w procesie tworzenie pliku. Jest jednak różnica. W HTML nazwy znaczników mamy z góry określone a w XML-u możemy tworzyć je sami. Znaczniki w dokumencie XML umieszczamy w sposób zagnieżdżony ale o tym za chwilkę przy omawianiu tworzenia dokumentów w XML-u. OK, zacznijmy tworzyć coś praktycznego. Poniżej przykład deklaracji pliku XML. W trakcie deklaracji dokumentu XML określamy takie jego właściwości jak wersję, kodowanie.

LINQ to XML
Listing 19.0 Deklaracja dokumentu XML.

Teraz możemy wprowadzać poszczególne elementy. Jak już wcześniej wspomniałem jest kilka zasad którymi powinniśmy się kierować przy tworzeniu dalszej struktury pliku XML.

  • nazwy elementów (znaczników) tworzymy sami,
  • elementy możemy zagnieżdżać w sobie,
  • każdy element musi posiadać znacznik otwierający i zamykający (dobrą praktyką jest, żeby od razu przy tworzeniu jakiegoś elementu tworzyć znacznik otwierający i zamykający wtedy unikniemy błędów i przy większym dokumencie szukania brakującego znacznika),

Poniżej przykład z kilkoma zagnieżdżonymi elementami.

LINQ to XML
Listing 19.1 Przykładowy plik XML.

Należy jeszcze wspomnieć, że dodatkowy przy naszych elementach możemy dodawać dodatkowe informacje. Takie dodatkowe informacje nazywamy atrybutami i dodajemy je w następujący sposób.

LINQ to XML. Deklaracja elementu.
LINQ to XML. Deklaracja elementu.

Przez niektórych niedoceniany ale moim zdaniem niemniej ważnym elementem pliku XML jest komentarz. Komentarze w XML-u dodajemy w poniższy sposób.

LINQ to XML. Dodawanie komentarzy do dokumentu XML.
LINQ to XML. Dodawanie komentarzy do dokumentu XML.

Kod z listingu 19.1 stanowi prosty przykład pliku XML. Moglibyśmy skopiować ten kod, otworzyć notatnik w systemie Windows, skopiować ten kod do naszego pliku i przy zapisywaniu pliku zmienić rozszerzenie pliku na XML i nasz pierwszy plik XML gotowy.

Możemy to także zrobić z poziomu kodu C# w Visual Studio. Aby to zrobić do przestrzeni nazw musimy dodać przestrzeń System.Xml.Linq;, dzięki której będziemy mogli za pomocą C# utworzyć plik XML.

Przy tworzeniu naszego pliku wykorzystamy poniższe instrukcje:

xDocument – deklarujemy nowy plik XML

XDeclaration – deklaracja właściwości naszego odkumentu (wersja, kodowanie itp.)

XElement – dodawanie nowego elementu

XAttribute – dodawanie atrybutu do elementu

XComment – dodawanie komentarza

Teraz spróbujemy utworzyć taką samą strukturę pliku XML jaką przedstawia listing 19.1. Jedyną trudnością jest zagnieżdżenie elementu w elemencie np. zagnieżdżenie elementu <opel> w elemencie <samochod>.

Poniżej pierwszy sposób tworzenia takiego pliku. Polega on na odpowiednim sposobie deklaracji poszczególnych argumentów konstruktora. Poniżej przedstawiam kod dzięki któremu stworzymy dokument XML zgodny z treścią z listingu 19.1. Wykorzystamy w nim instrukcje opisane powyżej.

Listing 19.2 Tworzymy nasz pierwszy plik XML.

Listing 19.2 Tworzymy nasz pierwszy plik XML.
Listing 19.2 Tworzymy nasz pierwszy plik XML.

Zobacz kod.

Pierwszą instrukcją jest konstruktor klasy XDocument, czyli rozpoczynamy tworzenie naszego dokumentu XML. Nasz konstruktor zawiera trzy argumenty, oznaczone różnymi kolorami (listing 19.2). Każdy parametr oddzielamy przecinkiem. Pierwszy parametr (instrukcja XDeclaration), oznaczony kolorem czerwonym, to deklaracja właściwości naszego dokumentu. Drugi argument (instrukcja XComment), oznaczony kolorem pomarańczowym, to komentarz dodany do treści naszego dokumentu. Trzeci argument (instrukcja XElement), oznaczony kolorem niebieskim, to deklaracja naszych elementów. Poleceniem xml.Save(); tworzymy nasz nowy dokument.

Teraz przejdźmy do części gdzie deklarujemy nasze elementy (część niebieska). Poniżej listing 19.3 pokazuje sposób zagnieżdżenia elementów w naszym dokumencie. Poszczególnymi kolorami zaznaczone zostały poszczególne poziomy zagnieżdżenia elementów. W przypadku każdego elementu pierwszym argumentem jest nazwa elementu np. „samochod”, „opel” i „astra”. Zwróćmy uwagę, że drugim parametrem elementu „samochod” jest element o nazwie „opel” a drugim parametrem elementu „opel” jest element „astra”. W ten właśnie sposób zagnieżdżamy elementy.

Listing 19.3 Deklaracja zagnieżdżonych elementów.
Listing 19.3 Deklaracja zagnieżdżonych elementów.

Aby utworzyć nasz nowy plik XML uruchamiamy nasz program. Plik który „zadeklarowaliśmy”, w naszym przypadku plik ma nazwę NaszPierwszyPlikXML.xml, zostanie utworzony w katalogu naszego projektu w podkatalogu bin/Debug. Możemy go wyedytować w notatniku, co obrazuje poniższy rysunek.

Rysunek 19.1 Zawartość pliku „NaszPierwszyPlikXML.xml”.

Rysunek 19.1 Zawartość pliku „NaszPierwszyPlikXML.xml”.
Rysunek 19.1 Zawartość pliku „NaszPierwszyPlikXML.xml”.

Drugim sposobem jest deklarowanie osobno poszczególnych elementów dokumentu XML a dopiero później za pomocą metody Add odpowiednie ich łączenie i zagnieżdżanie. Poniżej przykład takiego podejścia do tworzenia dokumentu XML.

Listing 19.4 Drugi sposób tworzenia dokumentów XML.
Listing 19.4 Drugi sposób tworzenia dokumentów XML.

Zobacz cały kod.

Po uruchomieniu programu (F5) w katalogu naszej aplikacji w podkatalogu bin/Debug, zostanie utworzony plik o nazwie „NaszDrugiPlikXML.xml”. Po otworzeniu naszego pliku w dowolnym edytorze tekstowym np. w notatniku zobaczymy znajomą strukturę naszego pliku XML, co obrazuje poniższy rysunek.

Rysunek 19.2 Zawartość pliku „NaszDrugiPlikXML.xml”.
Rysunek 19.2 Zawartość pliku „NaszDrugiPlikXML.xml”.