Ostatnio na forum

Informacje

Aktualności

Testy, recenzje

Hardware

Zadaj pytanie

Porady

Twoje zdanie liczy się

Kalkulator graficzny warty zakupu ?
 


Artykuł może warty poświęcenia uwagi?

Nowy Thunderbird wylądował

 

 

 

Dostępna jest nowa wersja klienta poczty spod znaku Mozilli Thunderbird 1.5.0.8. 

 

Czytaj
 

Compu.pl - Portal komputerowy

Implementacja nowego systemu zostaje przesunięta na styczeń 2009

Przetwarzanie dokumentów XML w C#.NET część 1 PDF Drukuj Email
Napisał: red. Adrian Rusznica   
14.06.2006.

XML (eXtensible Markup Language - rozszerzalny język znaczników) jest językiem metaznaczników, pozwalającym definiować składnie strukturalnych języków znacznikowych opisujących dane dla dowolnych dziedzin.

...

Pokaże tu pewne metody przetwarzania w Microsoft Visual C# 2005 Express Edition.

...

 

KILKA SŁÓW O XML

XML (eXtensible Markup Language - rozszerzalny język znaczników) jest językiem metaznaczników, pozwalającym definiować składnie strukturalnych języków znacznikowych opisujących dane dla dowolnych dziedzin. Języki znaczników takie jak HTML mają zdefiniowaną liczbę znaczników opisujących pewne elementy. Gdy potrzebny jest znacznik, którego taki język nie zawiera zaczynają się problemy. Należy czekać na następną wersję z nadzieją pojawienia się potrzebnego znacznika, ale nie zawsze twórcy takiego języka przyjdą z pomocą. XML jest metajęzykiem, który pozwala definiować dowolne znaczniki potrzebne w danej dziedzinie. Nie daje on jednak stuprocentowej dowolności, istnieją pewne reguły, które należy zachować przy tworzeniu znaczników, jednak znaczenie tych znaczników można dostosować całkowicie do potrzeb dziedziny.

XML określa metaskładnię dla języków dziedzinowych, takich jak MusicML, MathML, CML.

Znaczniki opisują strukturę i znaczenie dokumentu, nie opisują natomiast układu elementów na stronie - formatowanie tworzy się osobno, w arkuszach stylów. Dokument XML zawiera znaczniki opisujące dane zawarte w dokumencie, bez jego wyglądu. Znaczniki HTML opisują formatowanie dokumentu np. <B> pogrubienie, <TD> tworzy komórki tabeli, <BR> następna linia.

W HTML filmy możemy opisać używając znaczników formatujących, jednak żaden z tych znaczników nie ma nic wspólnego z filmem. Kod taki może wyglądać następująco:

<dt>Tytuł: <b>Terminal</b></dt>

<dd>Produkcja: USA 2004</dd>

<dd>Reżyser: Steven Spielberg</dd>

<ul>

<dt>Aktorzy:</dt>

<li>Tom Hanks

<li>Catrin Zeta-Jones

</ul>

<dt>Tytul: <b>Angelus</b></dt>

<dd>Produkcja: Polska 2001</dd>

<dd>Reżyser: Lech Majewski</dd>

<ul>

<dt>Aktorzy: </dt>

<li>Jan Siodolczek

<li>Paweł Steinert

</ul>

Natomiast w XML te same dane można zapisać w taki sposób:

<?xml version="1.0" encoding="windows-1250"?>

<FILMY>

<FILM id="1">

<TYTUŁ>Terminal</TYTUŁ>

<ROK_PRODUKCJI>2004</ROK_PRODUKCJI>

<REŻYSER>Steven Spielberg</REŻYSER>

<AKTORZY>

<AKTOR>

<POSTAĆ/>

<IMIĘ>Tom</IMIĘ>

<NAZWISKO>Hanks</NAZWISKO>

</AKTOR>

<AKTOR>

<POSTAĆ/>

<IMIĘ>Catrin</IMIĘ>

<NAZWISKO>Zeta-Jones</NAZWISKO>

</AKTOR>

</AKTORZY>

<PRODUKCJA>USA</PRODUKCJA>

</FILM>

<FILM id="2">

<TYTUŁ>ANGELUS</TYTUŁ>

<ROK_PRODUKCJI>2001</ROK_PRODUKCJI>

<REŻYSER>Lech Majewski</REŻYSER>

<AKTORZY>

<AKTOR>

<POSTAĆ>Teofil</POSTAĆ>

<IMIĘ>Jan</IMIĘ>

<NAZWISKO>Siodolczek</NAZWISKO>

</AKTOR>

<AKTOR>

<POSTAĆ>Rudolf</POSTAĆ>

<IMIĘ>Paweł</IMIĘ>

<NAZWISKO>Steinert</NAZWISKO>

</AKTOR>

</AKTORZY>

<PRODUKCJA>Polska</PRODUKCJA>

</FILM>

</FILMY>

W XML używamy znaczniki mówiące o naturze danych, dzięki temu kod jest czytelniejszy i łatwiej domyślić się, co te dane znaczą.

BUDOWA XML

W skład dokumentu XML wchodzą:

Deklaracja – każdy dokument XML musi mięć w pierwszej linii wpis <?xml version="1.0"?>. Informuje przeglądarkę o zgodności dokumentu z formatem zalecanym prze W3c. Wpis ten może być roszeżony o atrybut informujący o sposobie kodowania tekstu (<?xml version="1.0" encoding="windows-1250"?>).

Komentarz – dokumenty mogą zawierać komentarze podobnie jak w, HTML, czyli informacje zawarte pomiędzy <!—- I --> nie są przetwarzane przez silnik XML.

Document Type Definition (DTD) – w pewnych sytuacjach DTD może poprzedzać dane zawarte w dokumencie. Ustala reguły, do jakich musza się stosować dane zawarte w XML np.: każdy film musi mieć tytuł, element wartość <ROK_PRODUKCJI> musi być liczba, itp.

Elementy – każdy dokument składa się z dokładni jednego głównego elementu, który ma znacznik początkowy i końcowy (<FILMY> ... </FILMY>). Wymusza to strukturę hierarchiczną dokumentu, zwaną też strukturą drzewiastą. Pomiędzy tymi znacznikami znajduje się zawartość elementu, która może składać się z innych elementów lub łańcucha znaków.

Atrybuty - Każdy element może zawierać zero lub więcej atrybutów opisanych w znaczniku początkowym (<FILM id="1">). Jest to po prostu jeszcze jeden sposób na przekazanie danych dotyczących elementu. Atrybut to para nazwa = "wartość".

UWAGA! Każdy element XML musi mieć swój znacznik początkowy oraz znacznik końcowy, w HTML można pominąć znaczniki końcowe np. można użyć tylko <BR> w XML musiałoby to wyglądać <BR/>, co oznacza <BR></BR>.

Każdy element XML musi mieć swój znacznik początkowy oraz znacznik końcowy, w HTML można pominąć znaczniki końcowe np. można użyć tylko <BR> w XML musiałoby to wyglądać <BR/>, co oznacza <BR></BR>.

UWAGA! W XML znaczenie ma wielkość liter znacznik <FILM> to nie ten sam znacznik, co <film>.

W XML znaczenie ma wielkość liter znacznik to nie ten sam znacznik, co <film>.

UWAGA! Nazwa elementu musi zaczynać się od litery lub znaku podkreślenia (_) i nie może zawierać spacji.

Nazwa elementu musi zaczynać się od litery lub znaku podkreślenia (_) i nie może zawierać spacji.

UWAGA! Wartość atrybutu musi być w cudzysłowie (atrybut="wartość"). W HTML można naprzemiennie stosować <img src=image.jpg> lub <img src="image.jpg> w XML musiałoby to wyglądać: <img src="image.jpg/>

Wartość atrybutu musi być w cudzysłowie (atrybut=""). W HTML można naprzemiennie stosować <img src=image.jpg> lub <img src="image.jpg> w XML musiałoby to wyglądać: <img src="image.jpg/>

WYMIANA DANYCH MIĘDZY APLIKACJAMI

XML jest otwartym językiem, nie jest objęty prawami autorskimi, patentowymi, czy tajemnicą handlową ani innymi ograniczeniami związanymi z ochroną własności intelektualnych. Jest on prosty do odczytu przez ludzi i komputery, więc jest idealnym językiem wymiany danych.

Załóżmy, że aplikacja X ma udostępniać pewne informacje dla aplikacji Y. Najprostszym sposobem jest stworzenie modułu dla aplikacji Y pozwalającego odczytywać dane składowane w formacie X. Problem zaczyna się, gdy format danych aplikacji X zostanie zmieniony, powstaną nowe elementy, które są przechowywane przez tą aplikacje. W tej sytuacji należałoby zaprojektować jakiś format pliku, zrozumiałego dla aplikacji X oraz Y. Format ten byłby niezależny od wewnętrznych formatów aplikacji. Jeżeli wybierzemy format binarny, zaczynają się problemy, gdy zajdzie potrzeba rozszerzenia danych przekazywanych. Z pomocą przychodzi nam XML, w którym wykorzystujemy pliki płaskie.

Pokaże tu pewne rozwiązanie napisane w Microsoft Visual C# 2005 Express Edition. Wybrałem ten język z dwóch powodów - po pierwsze całe środowisko jest udostępnione za darmo, po drugie zawiera on już potrzebne biblioteki do przetwarzania XML. Biblioteka System.XML pozwala przetwarzać pliki XML trzema sposobami:

przy pomocy obiektów System.XML.XmlTextReader oraz System.XML.XmlTextWriter

przy pomocy obiektów System.XML.XmlDocument (Document Object Model)

przy pomocy obiektów System.XML.XPath

Pierwszy sposób opiera się na strumieniach danych. Istnieją 3 implementacje klasy System.XML.XmlTextReader:

System.XML.XmlTextReader – odczyt danych XML z pliku, sprawdzając czy dokument jest poprawnie zbudowany. Odczytując dokument można poruszać się tylko do przodu.

– odczyt danych XML z pliku, sprawdzając czy dokument jest poprawnie zbudowany. Odczytując dokument można poruszać się tylko do przodu.

System.XML.XmlNodeReader – zapewnia tą samą funkcjonalność, co poprzednia funkcja, lecz odczytuje dane tylko z określonego węzła drzewa.

– zapewnia tą samą funkcjonalność, co poprzednia funkcja, lecz odczytuje dane tylko z określonego węzła drzewa.

System.XML.XmlValidationReader – to samo, co System.XML.XmlTextReader z możliwością sprawdzenia poprawności danych względem reguł zawartych w W3C Schema.

– to samo, co z możliwością sprawdzenia poprawności danych względem reguł zawartych w W3C Schema.

Klasa System.XML.XmlTextWriter – pozwala na zapisywanie danych do pliku XML, bez możliwości cofnięcia się do poprzednich linii

Odczyt dokumentu XML:

using System;

using System.Xml;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

// Inicjujemy obiekt System.XML.XmlTextReader, jako parametr podajemy ścieżkę do pliku

XmlTextReader xtr = new XmlTextReader("filmy.xml");

// Po utworzeniu obiektu wskaźnik umieszczany jest przed pierwszą linią pliku.

// Za każdym razem kiedy wywołujemy metodę Read() zwraca prawdę gdy pobierze fragment dokumentu a fałsz gdy się nie uda.

// Fragment ten odpowiada jednemu węzłowi z struktury dokumentu.

while (xtr.Read())

{

// Właściwość NodeType zwraca typ danego węzła, Name jego nazwę zaś Value jego wartość

Console.WriteLine(xtr.NodeType.ToString() + ":" + xtr.Name + ":" + xtr.Value);

// Metoda HasAttributes() typu logicznego sprawdza czy odczytany węzeł posiada atrybuty

if (xtr.HasAttributes)

{

// Jeżeli posiada atrybuty wartość zmiennej AttributeCount to ilość atrybutów w węźle

for (int i = 0; i < xtr.AttributeCount; i++)

{

// Atrybut wywołujemy metodą MoveToAttribute(i) gdzie i to indeks atrybutu

xtr.MoveToAttribute(i);

// Własności takie jak własności węzłów

Console.WriteLine(xtr.NodeType.ToString() + ":" + xtr.Name + ":" + xtr.Value);

}

// Wracamy do aktualnego węzła

xtr.MoveToElement();

}

}

Console.ReadKey();

}

}

}

Powyższy przykład pokazuje jak pobrać wszystkie elementy dokumentu, jednak najczęściej potrzebujemy wyłapać z dokumentu wartości pewnych elementów. Poniżej pokaże przykład wyświetlający wartość węzła <TYTUŁ>.

using System;

using System.Xml;

namespace ConsoleApplication2

{

class Program

{

static void Main(string[] args)

{

XmlTextReader xtr = new XmlTextReader("filmy.xml");while (xtr.Read())

{

// Za pomocą metody MoveToContent() przechodzimy do wybranego węzła

// Metoda ta sprawdza czy aktualny węzeł należy do typu: Element, End Element, EntityReference oraz End Entity.

// Po wywołaniu tej metody obiekt sprawdzi czy aktualny węzeł jest typu content i jeżeli test wypadnie negatywnie przeskakuje do najbliższego węzła spełniającego warunki.

// Musimy jednak uważać : jeżeli aktualny węzeł jest typu content to metoda ta nie spowoduje przeskoku do następnego elementu.

// Będziemy sprawdzać każdy węzeł osiągnięty poprzez MoveToContent() sprawdzając jego nazwę.

// Jeżeli będzie to wartość TYTUŁ to wywołamy ReadString() dla odczytania wartości zawartej w węźle.

if (xtr.MoveToContent() == XmlNodeType.Element && xtr.Name == "TYTUŁ")Console.WriteLine(xtr.ReadString());

}

}

}

}

Zapis dokumentu do pliku jest analogiczny do tworzenia pliku w dokumencie tekstowym.

using System;

using System.Text;

using System.Xml;

namespace ConsoleApplication3

{

class Program

{

static void Main(string[] args)

{

// Inicjujemy obiekt System.XML.XmlTextWriter, pierwszy parametr to nazwa pliku, drugi typ kodowania.

XmlTextWriter xtw = new XmlTextWriter("filmy.xml", Encoding.Default);

// Jeżeli nie ustawimy formatowania plik zostanie zapisany w jednej linii.

xtw.Formatting = Formatting.Indented;

// Rozpoczynamy zapisywanie pliku

// Wpisujemy nagłówek dokumentu XML

xtw.WriteStartDocument();

// Rozpoczynamy główny element

xtw.WriteStartElement("FILMY");

// Rozpoczynamy element FILM

xtw.WriteStartElement("FILM");

// Dodajemy atrybut id o wartości 1 do element FILM

xtw.WriteAttributeString("id", "1");

// Rozpoczynamy element elementu FILM

xtw.WriteStartElement("TYTUŁ");

// Dodajemy wartość elementu TYTUŁ

xtw.WriteString("Terminal");

// Zamykamy element TYTUŁ

xtw.WriteEndElement();

xtw.WriteStartElement("REŻYSER");xtw.WriteString("Steven Spielberg");

xtw.WriteEndElement();

xtw.WriteStartElement("ROK_PRODUKCJI");xtw.WriteString(

"2004");

xtw.WriteEndElement();

xtw.WriteStartElement("AKTORZY");

xtw.WriteStartElement("AKTOR");xtw.WriteStartElement(

"POSTAĆ");

xtw.WriteEndElement();

xtw.WriteStartElement("IMIĘ");xtw.WriteString("Tom");

xtw.WriteEndElement();

xtw.WriteStartElement("NAZWISKO");xtw.WriteString(

"Hanks");

xtw.WriteEndElement();

xtw.WriteEndElement();

xtw.WriteStartElement("AKTOR");xtw.WriteStartElement("POSTAĆ");

xtw.WriteEndElement();

xtw.WriteStartElement("IMIĘ");xtw.WriteString(

"Catrin");

xtw.WriteEndElement();

xtw.WriteStartElement("NAZWISKO");xtw.WriteString("Zeta-Jones");

xtw.WriteEndElement();

xtw.WriteEndElement();

xtw.WriteEndElement();

xtw.WriteStartElement("PRODUKCJA");xtw.WriteString("USA");

xtw.WriteEndElement();

// Zamykamy element FILM

xtw.WriteEndElement();

// Zamykamy główny element

xtw.WriteEndElement();

// Zamykamy dokument

xtw.WriteEndDocument();

// Wpisujemy komentarz

xtw.WriteComment("Dokumen utworzony przy pomocy obiektu XmlTextWriter");

// Zamykamy plik

xtw.Close();

}

}

}

Ten sposób nie należy do przyjemności i bardzo łatwo o pomyłkę. Powodem tego jest sposób dostępu do pliku, który w tym przypadku jest sekwencyjny. Zarówno XMLTextWriter i XmlTextReader nie są najlepszymi metodami obsługi dokumentów XML.

Istnieją inne przyjemniejsze metody przetwarzania XML wspomniane wcześniej, ale omówię je w następnym artykule.

 
« poprzedni artykuł

tes tes
Analiza oglšdalnoœci witryny statystyka