<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[[Xerces] DOM-Verarbeitung in mehreren Funktionen]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich benutze die Xerces c++ Bibliothek und stehe gerade vor einem Programmierproblem. Ich verarbeite per DOM in einer Funktion einen XML-String. Dazu benutze ich den XercesDOMParser. Nun würde ich gerne das DOMDocument zurückgeben und es in einer anderen Funktion in einer anderen Klasse weiterverarbeiten. Wenn ich dies mache bekomme ich jede Menge Speicherlecks, weil ich zwar den Zeiger auf das DOMDocument löschen kann, nicht aber den Parser. Wenn ich diesen nämlich vorher lösche ist auch mein DOMDocument futsch. Deswegen frage ich mich, ob das überhaupt der richtige Weg ist um ein Dokument anderen Funktionen zur Weiterverarbeitung zur Verfügung zu stellen.</p>
<pre><code>XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument* CXMLTest::parseMyString2()
{
	XercesDOMParser* parser = new XercesDOMParser();
	parser-&gt;setValidationScheme(XercesDOMParser::Val_Always); // optional.
	parser-&gt;setDoNamespaces(true); // optional
	char* xmlStream = &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;ISO-8859-1\&quot;?&gt;&lt;FUNCTION NAME=\&quot;GET_MEASURESTATUS\&quot; ID=\&quot;1149758883\&quot; KENNUNG=\&quot;dd1\&quot; PWD=\&quot;dd1\&quot;/&gt;&quot;;
	static const char* pstrMemBufId = &quot;myTest&quot;; 

	MemBufInputSource* memBufIS = new MemBufInputSource
	(
		( const XMLByte* )xmlStream
		, strlen( xmlStream )
		, pstrMemBufId
		, false
	);

	try 
	{
		parser-&gt;parse( *memBufIS );
	}
	catch (...) 
	{
		delete memBufIS;

		return false;
	}
	return parser-&gt;getDocument();
}
</code></pre>
<p>Wie geht man denn in diesem Fall vor?</p>
<p>Gruß</p>
<p>Sascha</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/152195/xerces-dom-verarbeitung-in-mehreren-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 21:48:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/152195.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Jul 2006 08:27:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Xerces] DOM-Verarbeitung in mehreren Funktionen on Tue, 04 Jul 2006 08:27:00 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich benutze die Xerces c++ Bibliothek und stehe gerade vor einem Programmierproblem. Ich verarbeite per DOM in einer Funktion einen XML-String. Dazu benutze ich den XercesDOMParser. Nun würde ich gerne das DOMDocument zurückgeben und es in einer anderen Funktion in einer anderen Klasse weiterverarbeiten. Wenn ich dies mache bekomme ich jede Menge Speicherlecks, weil ich zwar den Zeiger auf das DOMDocument löschen kann, nicht aber den Parser. Wenn ich diesen nämlich vorher lösche ist auch mein DOMDocument futsch. Deswegen frage ich mich, ob das überhaupt der richtige Weg ist um ein Dokument anderen Funktionen zur Weiterverarbeitung zur Verfügung zu stellen.</p>
<pre><code>XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument* CXMLTest::parseMyString2()
{
	XercesDOMParser* parser = new XercesDOMParser();
	parser-&gt;setValidationScheme(XercesDOMParser::Val_Always); // optional.
	parser-&gt;setDoNamespaces(true); // optional
	char* xmlStream = &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;ISO-8859-1\&quot;?&gt;&lt;FUNCTION NAME=\&quot;GET_MEASURESTATUS\&quot; ID=\&quot;1149758883\&quot; KENNUNG=\&quot;dd1\&quot; PWD=\&quot;dd1\&quot;/&gt;&quot;;
	static const char* pstrMemBufId = &quot;myTest&quot;; 

	MemBufInputSource* memBufIS = new MemBufInputSource
	(
		( const XMLByte* )xmlStream
		, strlen( xmlStream )
		, pstrMemBufId
		, false
	);

	try 
	{
		parser-&gt;parse( *memBufIS );
	}
	catch (...) 
	{
		delete memBufIS;

		return false;
	}
	return parser-&gt;getDocument();
}
</code></pre>
<p>Wie geht man denn in diesem Fall vor?</p>
<p>Gruß</p>
<p>Sascha</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1091020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1091020</guid><dc:creator><![CDATA[Sascha Bahl]]></dc:creator><pubDate>Tue, 04 Jul 2006 08:27:00 GMT</pubDate></item><item><title><![CDATA[Reply to [Xerces] DOM-Verarbeitung in mehreren Funktionen on Tue, 04 Jul 2006 08:52:25 GMT]]></title><description><![CDATA[<p>Du mußt das Dokument natürlich sichern, bevor du den dazugehörigen Parser freigeben willst:</p>
<pre><code class="language-cpp">DomDocument* dok = parser-&gt;GetDocument()
delete parser;
return dok;
</code></pre>
<p>Alternativ könntest du den Parser auch aktiv halten, solange dein CXMLTest-Objekt existiert (als Membervariable, die erst im Dtor freigegeben wird).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1091042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1091042</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 04 Jul 2006 08:52:25 GMT</pubDate></item><item><title><![CDATA[Reply to [Xerces] DOM-Verarbeitung in mehreren Funktionen on Tue, 04 Jul 2006 09:22:55 GMT]]></title><description><![CDATA[<p>Vielen Dank für die rasche Antwort. Leider werden aber beim Freigeben des Parsers auch alle darin enthaltenen Dokumente gelöscht. Ein Zugriff auf das DOMDocument ist nach dem Löschen des Parsers nicht mehr möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1091073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1091073</guid><dc:creator><![CDATA[Sascha Bahl]]></dc:creator><pubDate>Tue, 04 Jul 2006 09:22:55 GMT</pubDate></item><item><title><![CDATA[Reply to [Xerces] DOM-Verarbeitung in mehreren Funktionen on Tue, 04 Jul 2006 10:17:44 GMT]]></title><description><![CDATA[<p>wenn du den parser loeschen willst, musst du die XML daten halt vorher in deine eigene struktur ueberfuehren.<br />
Stell dir dom einfach als riesigen uneffektiven cache vor, denn du bei bedarf einfach &quot;serialisieren&quot; willst kannst darfst.</p>
<p>Deshalb macht DOM vor allem in solchen szenarien Sinn, wo du nen geparstes XML file im Speicher (DOM Dokument hasst) der als cache fuer die einstellungen fuer nen anderes Lebendes Objekt dient.<br />
Z.b. Ne Aplication wo deine Fenster sich serialisieren ... die fenster selber bekommen nen verweis auf ihren DOM Node, und schreiben /lesen da drinne.<br />
Am anfang wird das XML dokument geparst, und wenn App zu ende, wird der inhalt weggeschrieben und der parser zerstoert.</p>
<p>Auch wenn das ned hoeren willst,<br />
fuer alle komplizierteren Dinge ist rein performancetechnisch und so weiter ist SAX einfach die bessere wahl.</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1091112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1091112</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Tue, 04 Jul 2006 10:17:44 GMT</pubDate></item><item><title><![CDATA[Reply to [Xerces] DOM-Verarbeitung in mehreren Funktionen on Tue, 04 Jul 2006 10:44:00 GMT]]></title><description><![CDATA[<p>Hallo RHBaum!<br />
Vielen Dank für die Antwort. Leider helfen mir Deine Ausführungen jetzt auch nicht. Ich habe ein Programm bei dem ich den vorhandenen Parser durch Xerces ersetze. Also steht das Design der Anwendung auch schon fest.</p>
<p>Es ist einfach so, dass ich in einer Klasse das XML-Dokument parse und zur weiteren Verarbeitung einer anderen Klasse übergeben muss.</p>
<p>Deswegen hätte ich gern gewusst, wie hier der klassische Weg aussieht. Leider gibt die Dokumentation zu Xerces dazu und zu vielen anderen Dingen nicht viel her. Es gibt eine Menge Objekte, aber nur unzureichend erklärt und ohne Beispiele.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1091125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1091125</guid><dc:creator><![CDATA[Sascha Bahl]]></dc:creator><pubDate>Tue, 04 Jul 2006 10:44:00 GMT</pubDate></item><item><title><![CDATA[Reply to [Xerces] DOM-Verarbeitung in mehreren Funktionen on Tue, 04 Jul 2006 12:17:37 GMT]]></title><description><![CDATA[<p>anstatt DOMDocument direkt zu verwenden, versuch mal mit dem Proxy Object. etwa so:</p>
<pre><code class="language-cpp">class DomDocumentProxy
{
  public:
    DomDocumentProxy(XercesDOMParser *);
    DomDocumentProxy(const DomDocumentProxy &amp;);

    DOMDocument *getDocument();

  private:
    boost::shared_ptr&lt;XercesDOMParser&gt; parser;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1091207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1091207</guid><dc:creator><![CDATA[ssm]]></dc:creator><pubDate>Tue, 04 Jul 2006 12:17:37 GMT</pubDate></item><item><title><![CDATA[Reply to [Xerces] DOM-Verarbeitung in mehreren Funktionen on Tue, 04 Jul 2006 12:39:34 GMT]]></title><description><![CDATA[<p>Hallo ssm!</p>
<p>Vielen Dank für Deinen Beitrag! Wäre nett, wenn Du mir Deinen Codeschnippsel erklären könntest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1091215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1091215</guid><dc:creator><![CDATA[Sascha Bahl]]></dc:creator><pubDate>Tue, 04 Jul 2006 12:39:34 GMT</pubDate></item><item><title><![CDATA[Reply to [Xerces] DOM-Verarbeitung in mehreren Funktionen on Tue, 04 Jul 2006 12:55:39 GMT]]></title><description><![CDATA[<p>Was ssm dir in c++ worten sagen will : ^^</p>
<p>dein parser muss solangegueltig (also nicht geloescht) sein, solange du zugriff auf dein Document brauchst ^^</p>
<p>wie man die lebensdauer eines objects gestaltet, kann sehr unterschiedlich sein. smartpointer sind ne sehr elegante loesung in bestimmten anwandungsfaellen ...</p>
<p>Das sind aber tiefste c++ grundlagen ....</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1091223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1091223</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Tue, 04 Jul 2006 12:55:39 GMT</pubDate></item><item><title><![CDATA[Reply to [Xerces] DOM-Verarbeitung in mehreren Funktionen on Tue, 04 Jul 2006 13:25:49 GMT]]></title><description><![CDATA[<p>Sascha Bahl schrieb:</p>
<blockquote>
<p>Wäre nett, wenn Du mir Deinen Codeschnippsel erklären könntest.</p>
</blockquote>
<p>Eigentlich hat RHBaum alles gesagt, was ich sagen wollte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Noch ein Codesnippet shadet denke ich nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<pre><code class="language-cpp">typedef boost::shared_ptr&lt;XercesDOMParser&gt;  XercesDOMParserPtr; 

class DomDocumentProxy 
{ 
  public: 
    explicit DomDocumentProxy(const DomDocumentProxy &amp;obj)
	:	parser(obj.parser)
    {
    }

    explicit DomDocumentProxy(XercesDOMParserPtr parser)
	:	parser(parser)
    {
    }

    DOMDocument *getDocument()
    {
        return parser-&gt;getDocument();
    }

  private: 
    XercesDOMParserPtr parser; 
}; 

DomDocumentProxy CXMLTest::parseMyString2() 
{ 
    XercesDOMParserPtr parser(new XercesDOMParser()); 
    parser-&gt;setValidationScheme(XercesDOMParser::Val_Always); // optional. 
    parser-&gt;setDoNamespaces(true); // optional 
    char* xmlStream = &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;ISO-8859-1\&quot;?&gt;&lt;FUNCTION NAME=\&quot;GET_MEASURESTATUS\&quot; ID=\&quot;1149758883\&quot; KENNUNG=\&quot;dd1\&quot; PWD=\&quot;dd1\&quot;/&gt;&quot;; 
    static const char* pstrMemBufId = &quot;myTest&quot;; 

    std::auto_ptr&lt;MemBufInputSource&gt; memBufIS(new MemBufInputSource 
        ( const XMLByte* )xmlStream, strlen( xmlStream ), pstrMemBufId, false));

    parser-&gt;parse(*memBufIS); 

    return DomDocumentProxy(parser);
}
</code></pre>
<p>so würdest du dann die Methode vervenden:</p>
<pre><code class="language-cpp">{
   DomDocumentProxy myDocProxy = parseMyString2();
   DOMDocument myDoc = myDocProxy-&gt;getDocument();

   myDoc-&gt;appendChild(
	myDoc-&gt;createElement(&quot;aaa&quot;));
   {
       DomDocumentProxy proxy2 = myDocProxy;
       ....
   }   
}
</code></pre>
<p>XercesDOMParserPtr sorgt dafür, dass Objekt des Klasses XercesDOMParser nur dann zerstört wird, wenn auf ihn keine References gibt.</p>
<p>P.S. hoffe du kannst mein Deutsch verstehen :-)))</p>
<p>edit : &quot;explicit&quot; shadet auch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1091241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1091241</guid><dc:creator><![CDATA[ssm]]></dc:creator><pubDate>Tue, 04 Jul 2006 13:25:49 GMT</pubDate></item><item><title><![CDATA[Reply to [Xerces] DOM-Verarbeitung in mehreren Funktionen on Wed, 05 Jul 2006 09:18:05 GMT]]></title><description><![CDATA[<p>Ja, super! Danke, ssm! Ich war mir über diese Methoden gar nicht so bewusst. Nun habe ich mir auch boost installiert. Werde ich wohl jetzt öfter verwenden. Ach, RHBaum: Grundlagen würde ich das jetzt nicht nennen, aber der Mensch ist ja lernfähig <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
<p>Ich habe allerdings das Beispiel etwas modifizieren müssen. Aus der Klasse DomDocumentProxy habe ich die explicit entfernt. Bei der Verwendung der Methode würde es dann eher so heissen:</p>
<pre><code class="language-cpp">DomDocumentProxy myDocProxy = xml_test.parseMyString2();
XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument* myDoc = myDocProxy.getDocument();
</code></pre>
<p>myDoc muss ein Pointer auf DOMDocument sein. Methoden der Proxy-Klasse werden über den Punkt-Operator angesprochen.</p>
<p>Aber jetzt funktioniert das wirklich super und mein Problem ist damit gelöst. Vielen Dank an alle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1091631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1091631</guid><dc:creator><![CDATA[Sascha Bahl]]></dc:creator><pubDate>Wed, 05 Jul 2006 09:18:05 GMT</pubDate></item><item><title><![CDATA[Reply to [Xerces] DOM-Verarbeitung in mehreren Funktionen on Wed, 05 Jul 2006 09:35:40 GMT]]></title><description><![CDATA[<blockquote>
<p>Ach, RHBaum: Grundlagen würde ich das jetzt nicht nennen, aber der Mensch ist ja lernfähig <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
</blockquote>
<p>Ich denk schon das betrachtungen zur lebensdauer von Objekten zu den Grundlagen gehoeren ... und das man gewisse Techniken um die Lebensdauer zu beeinflussen kennen sollte.<br />
Ok, bei mir gehoert zu den Grundlagen halt nich nur, das man jedes c++ schluesselwort herbeten kann, sondern auch gewisse techniken und methoden.</p>
<p>Ob nen proxy an der stelle mittels smartpointer ueberhaupt notwendig ist, da mag ich meine Hand ned ins Feuer legen fuer. Denk mal ne einfache verschiebung der parserinstanz an ne langlebigere stelle haette es auch getan.</p>
<p>Aber schadet auf der anderen seite auch nicht, und der performance und speicheroverhead wird Dir an der stelle nicht wirklich was ausmachen. Dafuer bekommst ne weitere Abstraktion, und du lernst noch was dazu ^^</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1091639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1091639</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 05 Jul 2006 09:35:40 GMT</pubDate></item></channel></rss>