000
19.09.2006, 10:30 Uhr
~KrokoDiehl
Gast
|
Hallo auch!
Nach langer Suche ohne wahren Erfolge wende ich mich nun an das Forum hier. Und zwar geht es um Folgendes:
Problemstellung Ich habe ein C++ Projekt das u.a. XML-Daten parsen soll. Dafür benutze ich den XML SAX2-Parser von Xerces (Apache). Es geht auch alles soweit nur scheitere ich bei dem schlussendlichen parse()-Aufruf. Das genaue Problem ist: der Parser möchte eine URI oder ein InputSource-Objekt, ich aber habe "nur" einen String (als char*) mit dem XML.
Die Frage Wie bekomme ich meine XML-Daten im char*-Format zur InputSource, bzw. in ein Format das der SAX-Parser mag?
Der Code Der Code, in Auszügen, sieht wie folgt aus:
C++: |
class MySAXParser : public DefaultHandler { SAX2XMLReader* saxParser; ...
void myParse (const char* xmlData) { try { saxParser->parse( xmlData ); <--- hier kracht es und eine SAXParseException wird geworfen } catch (const XMLException& xmlExc) { cout << "XMLException message is: " << xmlExc.getMessage() << "\n"; return; } //catch XMLException catch (const SAXParseException& saxPEcx) { cout << "SAXParseException message is: " << saxPEcx.getMessage() << "\n"; return; } //catch SAXParseException catch (...) { cout << "Unexpected Exception \n"; return; } //catch } //void myParse() } //class
|
Ich habe es getestet und es liegt tatsächlich nur an dem Aufruf von SAX2XMLReader::parse(). Mein Problem ist also, dass ich meinen char* nicht in eine akzeptierte InputSource bekomme.
Beispiel aus Java Ich habe das gleiche (!) in Java auch machen müssen und da hing ich ebenfalls an der gleichen Kante, aber hier war es einfacher zu lösen, nämlich konnte man seinen String mit dem XML in ein StringReader-Objekt umwandeln und dieses schließlich in ein InputSource-Objekt, dass Xerces akzeptierte:
StringReader stringReader = new StringReader(xmlData); InputSource inputSource = new InputSource(stringReader);
try { m_saxParser.parse(inputSource); ... ...eine ähnliche Funktionsweise fehlt mir noch für C++.
getestete Alternativen 1) ich habe es auch schon mit dem Xerces-eigenenen XMLCh* probiert, bringt mich aber direkt nicht weiter 2) InputSource ist die Oberklasse von anderen Klassen, z.B. MemBufInputSource, aber hier kam ich auch nicht weiter, wenngleich ich hier eher eine Lösung vermute
Link zur Quelle... www.ar-ent.net/dar/arlib32/out/html/man/xerces.1.7.0/apiDocs/index.html ist die API von Apache Xerces C++
Also, wenn jemand eine Lösung oder Lösungsvorschläge hat, freue ich mich.
Vielen Dank und Gruß, KrokoDiehl |