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:
<!DOCTYPE>
(czyli z czymś, czego nikt normalny już nie używa ;-))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 ;)
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 :).
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ą :)
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.
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.
I właśnie dlatego zupełnie nikt go nie używa, prawda? :)
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.
@idlecode: _cokolwiek_? Chocby YAML.
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.