XML-DAtei schreiben mit C++ und Xerces

kleinemue

Grünschnabel
Hallo!

Ich schreib gerade an einem Programm das eine recht komplexe Struktur in ein XML Dokument schreiben soll.
Die DOM-Struktur baue ich auf, indem ich ein DOMDocument erstelle und diesem die Knoten hinzufüge.
Da die Struktur recht komplex ist erstelle ich mehrere Documente und erhalte Knoten.
Diese werden letztendlich in ein DOMDocument eingefügt und diese mit dem DOMWriter geschrieben.
nach jedem Schreibvorgang sollte der Speicher wieder geleert werden, damit ich möglichst viele Strukturen schreiben kann.
Diese geschieht aber nicht, ich kann maximal 700 Datensätze schreiben, dann ist der Speicher voll.
hier ein beispiel wie ein complexer Knoten geschrieben wird, d.h. Element+Kinder:

void XML_Writer::writeComplex(CString parent, CString value, std::map<CString, CString> childs, DOMElement* &elemNode)
{
std::map<CString, CString>::iterator childs_it;
DOMDocument* node;
DOMImplementation* implComplex;

implComplex = DOMImplementationRegistry::getDOMImplementation(X("Core"));
//creates a new Node for this Element
node = implComplex->createDocument(
0, // root element namespace URI.
X(parent), // root element name
0); // document type object (DTD).

elemNode = node->getDocumentElement();

if(value != "")
{
DOMText* bufferTxt = node->createTextNode(X(value));
elemNode->appendChild(bufferTxt);
}

childs_it = childs.begin();

for(; childs_it != childs.end(); childs_it++)
{
DOMElement* bufferElem = node->createElement(X(childs_it->first));
elemNode->appendChild(bufferElem);

DOMText* bufferTxt = node->createTextNode(X(childs_it->second));
bufferElem->appendChild(bufferTxt);
}
}

Kann mir vielleicht jemand helfen und sagen wo mein Fehler liegt?
oder hat jemand schon einmal ähnlich Erfahrungen gemacht?
Hat jemand vielleicht Tips?

MfG
Sandra
 
Kann mir vielleicht jemand helfen und sagen wo mein Fehler liegt?
oder hat jemand schon einmal ähnlich Erfahrungen gemacht?
Hat jemand vielleicht Tips?
Ich habe bisher nur mit dem MS-XML-Parser gearbeitet. Da stand ich vor der Wahl, ob ich mit DOM oder SAX arbeiten will. Da ich einen sehr grossen Baum, den ich ohnehin im Speicher hatte, in XML serialisieren wollte, habe ich SAX verwendet anstelle von DOM. SAX war in dem Fall günstiger, da ja für DOM erst das komplette Dokument als XML-Baum aufgebaut werden muss (viel Speicher, wie du weisst, da die Daten quasi zweimal vorhanden sind). SAX baut keinen Baum (wie DOM) auf, sondern streamt eher direkt in die XML-Datei hinein, während durch meinen Tree durchiteriert wird. Ich weiss nicht, ob Xerces ebenfalls SAX unterstützt, aber du kannst ja mal nachsehen. SAX bedeutet übrigens "Simple API for XML" oder so.
SAX ist in jedem Fall die schlankere Alternative im Vergleich zu DOM.

--

Mir ist noch was an deinem Code aufgefallen:
void XML_Writer::writeComplex(CString parent, CString value, std::map<CString, CString> childs, DOMElement* &elemNode)
1. Du übergibst hier die Map mit den Childs per Wert statt per Referenz. Das ist inneffizient. Da das ganze vermutlich rekursiv aufgerufen wird, um so mehr. Vielleicht machst du daraus std::map<CString, CString>& childs , um es als Referenz zu übregeben.
2. Und dann übergibst du mit elemNode einen Pointer als Referenz. Hast du das gemacht, weil es sich dabei eigentlich um eine Art Rückgabewert handelt? Wenn ja, dann ist gut. Nebenbei, der Rückgabetyp ist void - kannst du da nicht den Pointer zurückgeben?
3. writeComplex() ruft sich anscheinend nicht direkt auf. Das ist vermutlich okay und kein Bug, oder?
 
Zuletzt bearbeitet:
Danke für die Antwort!

habe das Problem gefunden, alle DOMDocuments* müssen mit mit [DOMDocument*]->release(); wieder freigegebn werden, damit wird der speicher wieder geleert.

Gruß
Sandra
 

Neue Beiträge

Zurück