XML (rozszerzony język znaczników) to format zapisu danych w formie tekstu, który jest bardzo często wykorzystywany do zapisu danych. Najbardziej znanym wykorzystaniem tego formatu jest HTML wykorzystywany przez strony internetowe do formatowania danych i wyglądu strony. XML jest także wykorzystywany przez wiele innych aplikacji takich jak np. Inkscape, który do zapisu danych i ich formatowania wykorzystuje w przebiegły sposób format XML. Z tego względu warto wiedzieć co nieco o tym formacie danych i możliwości jego wykorzystania.
Prosty przykład kodu XML
Rzućmy łaskawym okiem na taki oto prosty kawałek kodu:
<movies>
<movie title="Red Dragon" year="2002"/>
<movie title="Silence of the lambs" year="1991"/>
</movies>
Dokumenty XML mają strukturę drzewiastą, co oznacza, że:
główny element root(korzeń) w dokumencie morze być tylko jeden, w przypadku powyższego kodu tym korzeniem jest znacznik movies;
korzeń morze mieć dowolną liczbę gałęzi, a gałęzie z kolei mogą również zawierać kolejne gałęzie. W przypadku powyższego kodu gałęzie to wszystkie znaczniki movie, które w tym przypadku nie zawierają ani treści ani podgałęzi więc zamknięte są znacznikiem />;
Warto też wiedzieć, że każda gałąź czy korzeń ma swoją nazwę oraz atrybuty. Nazwą korzenia dokumentu z powyższego kodu jest movies, korzeń ten nie ma atrybutów, natomiast atrybuty posiadają gałęzie o nazwie movie, nazwy atrybutów tychże gałęzi to:
title - zawiera tytuł filmu;
year - zawiera rok filmu
Można by rozszerzyć powyższy dokument np do takiej postaci:
W tym przypadku film "Red Dragon" ma gałąź actors(aktorzy) a ta zawiera kolejne gałęzie przechowujące informacje o aktorach i ich rolach.
Przykładowa implementacja odczytu, edycji i zapisu danych XML
Zróbmy sobie mały projekcik bazy danych filmów. Ograniczę się tutaj do minimalnej liczby elementów ponieważ chodzi mi jedynie o pokazanie jak w Qt można tworzyć, wczytywać i zapisywać dane XML. W tym celu konieczne będzie wykorzystanie następujących klas dostępnych w Qt:
QDomDocument - tworzy obiekt dokumentu XML;
QDomElement - element drzewa dokumentu;
QDomNode - węzeł drzewa dokumentu;
QDomNodeList - lista węzłów drzewa dokumentu
Klasa, która będzie zajmowała się obsługą bazy danych nazwana została przeze mnie MovieDatabase, a jej deklaracja w pliku moviesdatabase.h wygląda następująco:
#include <QCoreApplication>
#include "moviesdatabase.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MoviesDatabase moviesdtb("database.xml");
moviesdtb.addMovie("Red Dragon", 2002);
moviesdtb.addMovie("Silence of the lambs", 1991);
moviesdtb.writeMovies();
moviesdtb.save();
return a.exec();
}
Wynik działania programu po dwukrotnym jego uruchomieniu powinien być następujący:
Database: "database.xml" opened
Database document readed correctly
Film "Red Dragon" z 2002 roku juz jest w bazie danych
Film "Silence of the lambs" z 1991 roku juz jest w bazie danych
========================================================================
Lista filmow w bazie danych
========================================================================
Tytul:
"Red Dragon"
Rok:
2002
Tytul:
"Silence of the lambs"
Rok:
1991