XML w C++ – proste rozwiązanie

2010-05-19 16:13

XML kojarzy się raczej z technologiami webowymi i językami, które się z nimi wiążą – jak C#, Java, Ruby, itp. Nie zapominajmy jednak, że jest to także pewien format zapisu informacji. Ma on swoje wady (duży rozmiar), ale również zalety – jak np. możliwość edycji dowolnym edytorem tekstu – które mogą być pożyteczne w wielu zastosowaniach. Także wtedy, gdy piszemy w C++.
Oczywiście stworzenie własnego parsera XML nie jest bardzo trudne – mogę to powiedzieć z czystym sumieniem, gdyż samemu zdarzyło mi się takie dzieła (o różnym stopniu skomplikowania i funkcjonalności) popełnić w ilości co najmniej dwóch :) Nie jest to jednak zajęcia specjalnie kreatywne. Są też dla niego alternatywy i właśnie o jednej z nich – bibliotece dla C++ przeznaczonej do obsługi XML-a – chciałbym dzisiaj napisać.

Nazywa się ona TinyXML i jest to nazwa nadzwyczaj trafna. Jest to bowiem mały (ok. kilka tysięcy linii) i zgrabny kawałek kodu, który pozwala operować na dokumentach XML zarówno sensie odczytu, jak i zapisu. Rozprowadzany jest on na licencji ZLib, pozwalającej na używanie w produktach komercyjnych i niekomercyjnych. A ponieważ składa się na niego tylko kilka plików .cpp, łatwo korzystać z niego w projektach albo nawet dołączyć do własnego frameworka czy engine‘u.
A korzystać z TinyXML warto. Wśród istotnych cech tej biblioteki można wymienić to, że:

  • parsuje ogromną większość dokumentów XML; aktualnie kłopoty ma jedynie z tymi, w których specyfikacje DTD są osadzone bezpośrednio w sekcji <!DOCTYPE> (czyli z czymś, czego nikt normalny już nie używa ;-))
  • opiera się na modelu DOM (Document Object Model), czyli udostępnia zawartość plików XML w postaci drzewka elementów
  • obsługuje kodowanie UTF-8
  • używa STL i operatorów strumieniowych – ale tylko wtedy, jeśli o to poprosimy, definiując odpowiednie makro w czasie kompilacji

Nie mniej ważne jest to, że biblioteka TinyXML jest prosta w obsłudze. Jeśli mieliśmy coś wspólnego z przetwarzaniem XML w innych językach programowania, nie powinna nam ona sprawić żadnego kłopotu. Nie ma w niej naturalnie żadnych zaawansowanych feature‘ów w rodzaju zapytań XPath, transformacji XSL czy walidacji w oparciu o XML Schema, bo nie do takich zastosowań została ona stworzona. Jeżeli jednak nie potrzebujemy takiej zaawansowanej funkcjonalności, a chcemy jedynie np. odczytywać i zapisywać XML-owe pliki konfiguracyjne, stworzyć klienta RSS czy wykonywać tysiące innych pożytecznych, a nieskomplikowanych operacji na znacznikowym formacie danych, to TinyXML jest całkiem dobrym wyborem.
No, chyba że bardzo lubimy samodzielne pisanie parserów ;)

Tags: , , ,
Author: Xion, posted under Programming »


8 comments for post “XML w C++ – proste rozwiązanie”.
  1. Kot:
    May 19th, 2010 o 19:46

    TinyXML jest spoko, jeżeli mamy szybkie alokacje i wystarczająco pamięci na drzewo dokumentu. Mi niestety na jednej z platform to zabiło wczytywanie, gdyż parsing jednego dokumentu potrafił zająć kilkanaście sekund. Mając do wyboru zabawę z optymalizacją alokacji i irrXMLa (parser typu SAX) wybrałem to drugie :).

  2. Liosan:
    May 21st, 2010 o 8:45

    z tego co piszesz, dość porównywalne do rapidxml. I z tego co wiem na temat jego działania, przedmówca miałby podobny problem z pamięcią :)

  3. Xion:
    May 21st, 2010 o 9:02

    DOM to DOM – cały dokument w pamięci, więc cudów nie ma :) Jeśli jest duży albo platforma niezbyt pojemna pamięciowo, to trzeba się męczyć z SAX-em.

  4. Louis:
    May 21st, 2010 o 20:37

    Niestety nieprawdę piszesz, XML generalnie nie sprawdza się w większości przypadków jeżeli chodzi o zapis informacji, jest niewygodny zarówno dla ludzi jak i dla maszyn.

  5. Xion:
    May 21st, 2010 o 22:28

    I właśnie dlatego zupełnie nikt go nie używa, prawda? :)

  6. idlecode:
    May 22nd, 2010 o 6:53

    Louis: co proponujesz zamiast?
    XML mógłby być wygodniejszy (przez te ) jednak sprawdza się w takiej postaci w jakiej jest teraz – ludzie się do niego przyzwyczaili.

  7. yarpen:
    May 23rd, 2010 o 1:46

    @idlecode: _cokolwiek_? Chocby YAML.

  8. Reg:
    May 23rd, 2010 o 19:41

    Używam tinyxml w pracy i też mi się podoba. Jest mały, ma bardzo fajne API i używa STL-owych stringów.

    Ale może warto zainteresować się raczej językiem JSON? To też standard, pod wieloma względami lepszy od XML. Czytałem, że bywa stosowany w gamedevie.

Comments are disabled.
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.