Xerces C++ - Laden, Lesen und speichern, alternativen?
Ich bin auf der Suche für eine Anleitung zum laden einer XML-Datei, Lesen Sie es, ändern Sie es und speichern Sie abschließend mit C++. Ich bin mit Linux Ubuntu und versucht, Xerces. Mit Google und viel Zeit, konnte ich nur laden Sie eine XML-Datei:
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <iostream>
using namespace std;
using namespace xercesc;
int main (int argc, char* args[]) {
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Error during initialization! :\n"
<< message << "\n";
XMLString::release(&message);
return 1;
}
XercesDOMParser* parser = new XercesDOMParser();
parser->setValidationScheme(XercesDOMParser::Val_Always);
parser->setDoNamespaces(true); //optional
ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
parser->setErrorHandler(errHandler);
const char* xmlFile = "demo.xml";
try {
parser->parse(xmlFile);
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -1;
}
catch (const DOMException& toCatch) {
char* message = XMLString::transcode(toCatch.msg);
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -1;
}
catch (...) {
cout << "Unexpected Exception \n" ;
return -1;
}
DOMNode* docRootNode;
// DOMNode* aNode;
DOMDocument* doc;
doc = parser->getDocument();
docRootNode = doc->getDocumentElement();
cout << docRootNode->getAttributes() << endl; //returns Hex
delete parser;
delete errHandler;
return 0;
}
Wie ich Lesen kann, ein manipulieren der XML-Datei und schließlich speichern? Gibt es alternative Bibliotheken? (Ich habe versucht, tinyxml, aber die Dateien gibt Fehler zurück, wenn ich will, um es zu kompilieren)
- Ich hoffe, Sie nutzen die neue Xerces 3.* die alte 2.7/2.8 ist mit Speicher-Lecks ganz über dem Platz
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein Beispiel für das Speichern von xerces DOMDocument. Speichern eines Dokuments mit
siehe code-Beispiel http://xerces.apache.org/xerces-c/domprint-2.html
Und ein Beispiel für Filter-Implementierung. Sie finden diese in DOMPrint Beispiel.
LibXML++ zu sein scheint, das beste für C++. Feature-Weise, es ist sehr komplett, einschließlich XPath -, Zeichensatz-Konvertierungen (von Glibmm) und alles, was Sie erwarten würden, in einer XML-Bibliothek. Es verwendet traditionelle DOM-und SAX-APIs, die zählt als ein Profi oder ein con, je nachdem, wen Sie Fragen. Ein mögliches Problem ist, dass die Abhängigkeiten der Bibliothek sind äußerst schwer (aufgrund der Verwendung von Glibmm). Noch, es scheint die einzige anständige XML Bibliothek für C++.
http://libxmlplusplus.sourceforge.net/docs/manual/html/index.html
TinyXML analysiert XML nicht entsprechend der Spezifikation, so würde ich empfehlen, gegen das es, obwohl es funktioniert für einfache Dokumente.
Die Probe CreateDOMDocument kommt mit Xerces zeigt Ihnen, wie Sie zum hinzufügen von Knoten etc. ein DOM-Dokument. Den code hast du bisher erstellt das Dokument, so dass Sie anpassen müssen, um den code im zweiten Beispiel zum hinzufügen von Knoten, Attribute etc.
Beachten Sie auch, dass, wenn Sie sagen:
den getAttributes Funktion gibt eine Sammlung von Attributen, die Sie benötigen, um weitere Funktionen Xerces-Auflistung, um die enthaltenen Informationen.
Beachten Sie, dass wenn Sie möchten, zu extrahieren, eine Teilmenge der Daten in e-XML-Datei, kann es einfacher sein, verwenden Sie eine ereignisgesteuerte SAX-parser (Xerces enthält eine von diesen) eher als Gebäude-und walking eine komplette DOM-Dokument.
Wenn Sie möchten, um ein Beispiel zu sehen, wie zu tun, dass die Verwendung von Xerces-C++, überprüfen Sie heraus diesen code:
http://libprf1.tigris.org/files/documents/1338/13256/libprf1-0.1R3.tar.gz
Ich schrieb es vor langer Zeit als Uni-Projekt. Es ist wahrscheinlich, basierend auf einer veralteten version von Xerces-C++, aber ich denke nicht, dass die API hat sich geändert zu viel ein problem sein. Es wird zumindest geben Sie eine Idee.
Dem folgenden link ist ein gutes tutorial, die zeigen, dass die Grundlagen für das Lesen einer XML-Datei und analysieren mit XERCES.
http://www.yolinux.com/TUTORIALS/XML-Xerces-C.html
Wenn das geschehen ist, wird der XERCES-API sollte genug sein für die weitere Arbeit:
http://xerces.apache.org/xerces-c/apiDocs-2/classes.html
Schreiben (serialisieren) die Dokument -, Benutzer der Klasse DOMWriter
http://xerces.apache.org/xerces-c/apiDocs-2/classDOMWriter.html#a0ddcef5fed6b49e03e53334fedca4b2