XML-Parser

z.B. wxWidgets, GTK+, Qt, OpenGL, DirectX
Antworten
hofian
Beiträge: 62
Registriert: Do Sep 24, 2009 6:59 pm

XML-Parser

Beitrag von hofian » Di Dez 22, 2009 11:07 am

Ich bin momentan auf der Suche nach einem XML-Parser. Dabei sind mir folgende Kriterien wichtig:
  • plattformunabhängig
  • C++
  • frei verfügbar (LGPL)
Hat da jemand Erfahrungen oder kann Vorschläge machen?

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: XML-Parser

Beitrag von Jside » Di Dez 22, 2009 12:22 pm

Xerces? http://xerces.apache.org/xerces-c/

Ansonsten kanst du dir ja einen mini Browser (z.b. Dilo) auseinanderschrauben, der hat ja auch einen HTML parser drin(was ja prinzipiell XML ist)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: XML-Parser

Beitrag von Xin » Di Dez 22, 2009 1:57 pm

Ich habe meinen XML-Parser selbst geschrieben. Nette Übung Header und Code sind zusammen ca. 21kB, also gut überschaubar.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: XML-Parser

Beitrag von Kerli » Mi Dez 23, 2009 12:38 am

TinyXML ist sonst auch nicht so schlecht und dabei noch recht schlank. Lizenziert ist es glaub ich unter der zlib Lizenz. Oder wenn du willst kannst du auch meinen Parser verwenden oder dir dort Anregungen holen. Den Code dazu gibt es auf launchpad.net. Unlängst habe ich auch das Ansprechen mit einer XPath Syntax und auch mit Boost ähnlichen Insertern eingebaut, so dass man das ganz sehr konfortabel einsetzen kann:
config.xml:

Code: Alles auswählen

<config type="super-config" version="1">
  <videomode width="1680" height="1050" refreshrate="50" fullscreen="1"/>
  <savegame id="1">/home/tom/.supergame/save001.save</savegame>
</config>
Die vorhergehende XML-Datei kann man jetzt zb wie folgt verwenden:

Code: Alles auswählen

xml::Document config;
config.read("config.xml");

if( config["/@type"] != "super-config"  || config["/@version"] != 1 )  // Zurzeit noch so nicht möglich
// ist aber bereits auf meiner todo liste. Zurzeit müsste man das so machen:
// if( config.get<std::string>("/@type") != "super-config"  || config.get<int>("/@version") != 1 )
{
  std::cerr << "Invalid config file." << std::endl;
  return -1;
}

uint16 width = config["/videomode@width"];
uint16 height = config["/videomode@height"];
uint16 refreshrate = config["/videomode@refreshrate"];
bool fullscreen = config["/videomode@fullscreen"];

std::string savegame = config["/savegame"];
Oder das Erstellen der XML Datei würde so ausschauen:

Code: Alles auswählen

xml::Document config( xml::makeRoot("config") );

config.set
  ( "/@type", "super-config" )
  ( "/@version", 1 )
  
  ( "/videomode@width", 1680 )
  ( "/videomode@height", 1050 )
  ( "/videomode@refreshrate", 50 )
  ( "/videomode@fullscreen", 1 )

  ( "/savegame@id", 1 )
  ( "/savegame", "/home/tom/.supergame/save001.save" );

  config.write("config.xml");
</config>
Das nur so einmal als Anregung. Mein Parser ist zurzeit zwar unter der GPL, aber das ist ja nicht unbedingt was über das man nicht reden könnte. Wenn jemand meinen Code testet bin ich immer froh. Auch wenn ich den Parser schon in mehreren Projekten verwendet habe und er eigentlich schon recht stabil sein sollte :P
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten