Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » XML-Daten als char-Array mit Xerces C++

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.09.2006, 11:17 Uhr
~mike
Gast


Noch nie benutzt - aber ich denke du musst da vorher Mal einziges setzen:
Siehe: http://xml.apache.org/xerces-c/schema.html
Das sind vollständige Beispiele
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.09.2006, 11:44 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Mal ganz von deinem Code Problem abgesehen würde ich dir eher zu DOM als zu SAX raten.Ist zwar beides nicht sehr schwer zu handhaben aber DOM ist Komfortabler. Du kannst besser abfragen, welche werte die nodes haben und auch entsprechend reagieren. Das wil man ja meist, wenn man eine XML Datei parst ...

EDIT: Ansonsten sollte dir das helfen. Und evtl. noch StdInputSource ansehen
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

Dieser Post wurde am 19.09.2006 um 11:48 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.09.2006, 16:26 Uhr
~KrokoDiehl
Gast


Danke erst einmal für die Antworten.

SAX benutze ich, weil es eine Java-Seite gibt, die SAX benutzt und die C-Seite soll sehr ähnlich ablaufen. Zudem passt ein SAX-Parser besser in den Programmkontext, aber soviel dazu. Nebenbei bemerkt nutzt die DOM API von Xerces ziemlich ähnliche Methoden zum Parsen und benötigt auch nur URIs und InputSource ohne dass ich einen Weg sehe wie ich mein char-Array in eine InputSource bekomme.

Sicher stelle ich mich nur ungeschickt an... ich weiß es ;-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.09.2006, 19:51 Uhr
Spacelord
Hoffnungsloser Fall


Hi,
erstmal vorweg:
-dass der SAX2XMLReader nen Attribut des ContentHandlers ist,ist eher "unüblich"
-du musst dem SaxReader deine Handlerklasse erstmal mit parser->setContentHandler(this) bekanntmachen (this sofern SAX2XMLReader nen Attribut vom Handler bleiben soll.)
-hast du den SAX2XMLReader Pointer im Konstruktor von deinem Handler mit XMLReaderFactory::createXMLReader() initialisiert?

Und deinen Pfad müsstest du so hinkriegen:

C++:
void myParse (const char* xmlData)
  {
     try {
          XMLCh* _file_path = XMLString::transcode(xmlData);
          saxParser->parse( _file_path );
          XMLString::release(&_file_path);
    }


oder alternativ:

C++:
void myParse (const char* xmlData)
  {
     try {
          XMLCh* _file_path = XMLString::transcode(xmlData);
          LocalFileInputSource _input(_file_path);
          saxParser->parse( _input );
          XMLString::release(&_file_path);



Ob SAX oder DOM kommt immer auf die konkrete Situation an.
Pauschalaussagen wie "DOM ist viel besser" sind Käse.

Gruss Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 19.09.2006 um 20:00 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.09.2006, 12:32 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)



Zitat von J-jayz-Z:
Du kannst besser abfragen, welche werte die nodes haben und auch entsprechend reagieren. Das wil man ja meist, wenn man eine XML Datei parst ...


Ich hoffe dein Kommentar galt nicht mir
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.09.2006, 21:31 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von J-jayz-Z:


Ich hoffe dein Kommentar galt nicht mir


Natürlich nicht.

Gruss Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.09.2006, 09:20 Uhr
~KrokoDiehl
Gast


Hallo,
ich habe mittlerweile die Lösung herausbekommen. Es ging tatsächlich nur über die InputSource, und zwar die MemBufInputSource, denn meine XML-Daten befinden sich nicht
in irgendeiner Datei, sondern im einem String zur Laufzeit.

Initialisierung des Parsers und Xerces allgemein sind schon komplett. Die Lösung von meinem Kernproblem sieht wie folgt aus:


C++:
void myParse(const char* xmlData)
{
InputSource* inSource = new MemBufInputSource((const unsigned char*)xmlData,                                       strlen(xmlData),                                           "1",                                         false);            

try { saxParser->parse( *inSource ); }
catch (const XMLException& xmlExc)
{
   ...usw...
  }
} //void myParse(const char*)



Mein bisheriger Fehler lag also an der einen Zeile oben

Danke für eure Mühen.
Gruß,
KrokoDiehl
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: