<?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[xmlParseFile aus libxml2 funktioniert und funktioniert wieder nicht]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>ich muss euch leider noch einmal mit einem Problem belästigen. Dieses Mal geht es um die libxml2 und zwar etwas konkreter um die Funktion <a href="http://xmlsoft.org/html/libxml-parser.html#xmlParseFile" rel="nofollow">xmlParseFile</a>. Die Funktion zeigt in meinem Programm scheinbar willkürliches Verhalten... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>In meinem Programm habe ich vier Funktionen geschrieben, die in der folgenden Reihenfolge ausgeführt werden:</p>
<pre><code class="language-cpp">_writer-&gt;writeTracks(_track);
_writer-&gt;writeDrivers(_drivers);
_writer-&gt;writeMode(_mode);
_writer-&gt;writeLapsAndDist(_laps, _dist);
</code></pre>
<p>Das Programm lief schon vollständig durch. Seit dem ich eine Zeile, welche nichts anderes tat, als einen String auszugeben (zum finden eines Fehlers), aus dem Programm entfernt und neu kompiliert habe, bleibt das Programm in der Funktion writeLapsAndDist stehen. Die besagte Funktion xmlParseFile liefert einen Nullpointer und gibt folgende Fehlermeldung aus:</p>
<blockquote>
<p>I/O warning : failed to load external entity &quot;1&quot;</p>
</blockquote>
<p>Das führt zum werfen der Ausnahme.</p>
<p>Bei einem Kumpel, der sich auch schon mit dem Problem beschäftigt, tritt der gleiche Fehler bei der Funktion writeTracks auf.</p>
<p>Meine Vermutung, es könnte daran liegen, dass die xml-Dateien noch nicht fertig auf die Festplatte geschrieben sind, bevor sie wieder gelesen werden, hat sich leider als Falsch herausgestellt. Ich lies die entsprechenden Funktionen nach dem schreiben der xml-Datei 10 Sekunden warten, das Problem trat aber weiterhin auf.</p>
<p>Im Folgenden noch die vier Funktionen:</p>
<pre><code class="language-cpp">void writeConfig::writeTracks(const track &amp; t) const
{
	xmlDocPtr          doc;
	xmlNodePtr         node          = 0;
	xmlNodePtr         newNode       = 0;
	xmlXPathContextPtr context;
	xmlXPathObjectPtr  track         = 0;
	xmlXPathObjectPtr  trackList     = 0;

	doc = xmlParseFile(getXMLFileName());

	if (doc == 0)
		throw xml_parse_exception(&quot;Document not parsed successfully.&quot;);
	.
	.
	.
	xmlSaveFile(getXMLFileName(), doc);

	// Speicher freigeben
	xmlFreeDoc(doc);
	xmlXPathFreeObject(track);
	xmlXPathFreeObject(trackList);
}
</code></pre>
<pre><code class="language-cpp">void writeConfig::writeDrivers(const std::vector&lt;driver*&gt; &amp; d) const
{
	xmlDocPtr          doc;
	xmlNodePtr         node          = 0;
	xmlNodePtr         newNode       = 0;
	xmlXPathContextPtr context;
	xmlXPathObjectPtr  driver        = 0;
	xmlXPathObjectPtr  driverMaxNum  = 0;
	xmlXPathObjectPtr  driverList    = 0;
	int                maxNumberOfDrivers;

	doc = xmlParseFile(getXMLFileName());

	if (doc == 0)
		throw xml_parse_exception(&quot;Document not parsed successfully.&quot;);
	.
	.
	.
	xmlSaveFile(getXMLFileName(), doc);

	// Speicher freigeben
	xmlFreeDoc(doc);
	xmlXPathFreeObject(driver);
	xmlXPathFreeObject(driverMaxNum);
	xmlXPathFreeObject(driverList);

}
</code></pre>
<pre><code class="language-cpp">void writeConfig::writeMode(const mode &amp; m) const
{
	xmlDocPtr          doc;
	xmlXPathContextPtr context;
	xmlXPathObjectPtr  mode          = 0;

	doc = xmlParseFile(getXMLFileName());

	if (doc == 0)
		throw xml_parse_exception(&quot;Document not parsed successfully.&quot;);
	.
	.
	.
	xmlSaveFile(getXMLFileName(), doc);

	// Speicher freigeben
	xmlFreeDoc(doc);
	xmlXPathFreeObject(mode);
}
</code></pre>
<pre><code class="language-cpp">void writeConfig::writeLapsAndDist(unsigned int l, unsigned int d) const
{
	xmlDocPtr          doc;
	xmlXPathContextPtr context;
	xmlXPathObjectPtr  laps          = 0;
	xmlXPathObjectPtr  dist          = 0;

	doc = xmlParseFile(getXMLFileName());

	if (doc == 0)
		throw xml_parse_exception(&quot;Document not parsed successfully.&quot;);
	.
	.
	.
	xmlSaveFile(getXMLFileName(), doc);

	// Speicher freigeben
	xmlFreeDoc(doc);
	xmlXPathFreeObject(laps);
	xmlXPathFreeObject(dist);
}
</code></pre>
<p>Hat jemand von euch eine Idee, wie wo das Problem liegen könnte oder hat sogar das gleiche Problem schon einmal gehabt? Die Tatsache, dass das Problem mal auftritt und mal nicht macht das ganze für mich leider zu einem recht hartnäckigen Problem und erleichter mir auch nicht gerade das ergooglen einer Lösung. Daher würde ich mich an dieser Stelle sehr über Hilfe freuen.</p>
<p>Gruß<br />
Paul</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/288588/xmlparsefile-aus-libxml2-funktioniert-und-funktioniert-wieder-nicht</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 23:52:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288588.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 19 Jun 2011 17:36:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to xmlParseFile aus libxml2 funktioniert und funktioniert wieder nicht on Sun, 19 Jun 2011 18:29:40 GMT]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>ich muss euch leider noch einmal mit einem Problem belästigen. Dieses Mal geht es um die libxml2 und zwar etwas konkreter um die Funktion <a href="http://xmlsoft.org/html/libxml-parser.html#xmlParseFile" rel="nofollow">xmlParseFile</a>. Die Funktion zeigt in meinem Programm scheinbar willkürliches Verhalten... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>In meinem Programm habe ich vier Funktionen geschrieben, die in der folgenden Reihenfolge ausgeführt werden:</p>
<pre><code class="language-cpp">_writer-&gt;writeTracks(_track);
_writer-&gt;writeDrivers(_drivers);
_writer-&gt;writeMode(_mode);
_writer-&gt;writeLapsAndDist(_laps, _dist);
</code></pre>
<p>Das Programm lief schon vollständig durch. Seit dem ich eine Zeile, welche nichts anderes tat, als einen String auszugeben (zum finden eines Fehlers), aus dem Programm entfernt und neu kompiliert habe, bleibt das Programm in der Funktion writeLapsAndDist stehen. Die besagte Funktion xmlParseFile liefert einen Nullpointer und gibt folgende Fehlermeldung aus:</p>
<blockquote>
<p>I/O warning : failed to load external entity &quot;1&quot;</p>
</blockquote>
<p>Das führt zum werfen der Ausnahme.</p>
<p>Bei einem Kumpel, der sich auch schon mit dem Problem beschäftigt, tritt der gleiche Fehler bei der Funktion writeTracks auf.</p>
<p>Meine Vermutung, es könnte daran liegen, dass die xml-Dateien noch nicht fertig auf die Festplatte geschrieben sind, bevor sie wieder gelesen werden, hat sich leider als Falsch herausgestellt. Ich lies die entsprechenden Funktionen nach dem schreiben der xml-Datei 10 Sekunden warten, das Problem trat aber weiterhin auf.</p>
<p>Im Folgenden noch die vier Funktionen:</p>
<pre><code class="language-cpp">void writeConfig::writeTracks(const track &amp; t) const
{
	xmlDocPtr          doc;
	xmlNodePtr         node          = 0;
	xmlNodePtr         newNode       = 0;
	xmlXPathContextPtr context;
	xmlXPathObjectPtr  track         = 0;
	xmlXPathObjectPtr  trackList     = 0;

	doc = xmlParseFile(getXMLFileName());

	if (doc == 0)
		throw xml_parse_exception(&quot;Document not parsed successfully.&quot;);
	.
	.
	.
	xmlSaveFile(getXMLFileName(), doc);

	// Speicher freigeben
	xmlFreeDoc(doc);
	xmlXPathFreeObject(track);
	xmlXPathFreeObject(trackList);
}
</code></pre>
<pre><code class="language-cpp">void writeConfig::writeDrivers(const std::vector&lt;driver*&gt; &amp; d) const
{
	xmlDocPtr          doc;
	xmlNodePtr         node          = 0;
	xmlNodePtr         newNode       = 0;
	xmlXPathContextPtr context;
	xmlXPathObjectPtr  driver        = 0;
	xmlXPathObjectPtr  driverMaxNum  = 0;
	xmlXPathObjectPtr  driverList    = 0;
	int                maxNumberOfDrivers;

	doc = xmlParseFile(getXMLFileName());

	if (doc == 0)
		throw xml_parse_exception(&quot;Document not parsed successfully.&quot;);
	.
	.
	.
	xmlSaveFile(getXMLFileName(), doc);

	// Speicher freigeben
	xmlFreeDoc(doc);
	xmlXPathFreeObject(driver);
	xmlXPathFreeObject(driverMaxNum);
	xmlXPathFreeObject(driverList);

}
</code></pre>
<pre><code class="language-cpp">void writeConfig::writeMode(const mode &amp; m) const
{
	xmlDocPtr          doc;
	xmlXPathContextPtr context;
	xmlXPathObjectPtr  mode          = 0;

	doc = xmlParseFile(getXMLFileName());

	if (doc == 0)
		throw xml_parse_exception(&quot;Document not parsed successfully.&quot;);
	.
	.
	.
	xmlSaveFile(getXMLFileName(), doc);

	// Speicher freigeben
	xmlFreeDoc(doc);
	xmlXPathFreeObject(mode);
}
</code></pre>
<pre><code class="language-cpp">void writeConfig::writeLapsAndDist(unsigned int l, unsigned int d) const
{
	xmlDocPtr          doc;
	xmlXPathContextPtr context;
	xmlXPathObjectPtr  laps          = 0;
	xmlXPathObjectPtr  dist          = 0;

	doc = xmlParseFile(getXMLFileName());

	if (doc == 0)
		throw xml_parse_exception(&quot;Document not parsed successfully.&quot;);
	.
	.
	.
	xmlSaveFile(getXMLFileName(), doc);

	// Speicher freigeben
	xmlFreeDoc(doc);
	xmlXPathFreeObject(laps);
	xmlXPathFreeObject(dist);
}
</code></pre>
<p>Hat jemand von euch eine Idee, wie wo das Problem liegen könnte oder hat sogar das gleiche Problem schon einmal gehabt? Die Tatsache, dass das Problem mal auftritt und mal nicht macht das ganze für mich leider zu einem recht hartnäckigen Problem und erleichter mir auch nicht gerade das ergooglen einer Lösung. Daher würde ich mich an dieser Stelle sehr über Hilfe freuen.</p>
<p>Gruß<br />
Paul</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2080715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2080715</guid><dc:creator><![CDATA[_paul_]]></dc:creator><pubDate>Sun, 19 Jun 2011 18:29:40 GMT</pubDate></item><item><title><![CDATA[Reply to xmlParseFile aus libxml2 funktioniert und funktioniert wieder nicht on Tue, 12 Jul 2011 15:47:58 GMT]]></title><description><![CDATA[<p>Moin zusammen,</p>
<p>nachdem ich die letzten Wochen leider nicht die Zeit hatte, mich weiter mit dem Programm zu beschäftigen, habe ich nun endlich meinen Fehler gefunden. Die kurze Erklärung ist einfach, ich hatte von einer Funktion reservierten Speicher nicht wieder freigegeben, die ausführlichere Erklärung folgt hier:</p>
<p>In allen vier Funktionen deklariere ich jeweil eine Variable von den Typen xmlDocPtr und xmlXPathContextPtr, sowie mindestens eine Variable vom Typ xmlXPathObjectPtr. Später erstelle ich Objekte, deren Adresse ich in den entsprechenden Zeigern speichere. Schließlich gebe ich am Ende der einzelnen Funktionen den reservierten Speicher der Objekte wieder frei. Nur den Speicher des xmlXPathContext-Objekts gebe ich nicht frei, dies hätte ich mittels &quot;xmlXPathFreeContext(context);&quot; machen müssen.</p>
<p>Der zweite Fehler hätte nicht aus meinem Post hervorgehen können. In einer Funktion verwende ich folgenden Code:</p>
<pre><code class="language-cpp">if (!strcmp((char *) xmlGetProp(node, (const xmlChar *(&quot;name&quot;), &quot;name&quot;))
    ...
</code></pre>
<p>xmlGetProp() reserviert jedoch auch Speicher für den Rückgabewert, welcher vom Programmierer wieder freigegeben werden muss. Die Lösung sieht also folgendermaßen aus:</p>
<pre><code class="language-cpp">xmlChar *prop = xmlGetProp(node, (const xmlChar *)&quot;name&quot;);
if (!strcmp((char *) prop, &quot;name&quot;))
{
    ....
}
xmlFree(prop);
</code></pre>
<p>Damit steht zu dem Problem nun auch eine Lösung hier. Vielleicht habe ich damit ja noch dem ein oder anderen geholfen.</p>
<p>Vielen Dank an all diejenigen, welche meinen Tread durchgelesen haben und sich damit beschäftigt haben, auch wenn dieses Mal keiner geantwortet hat.</p>
<p>Gruß<br />
Paul</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091913</guid><dc:creator><![CDATA[_paul_]]></dc:creator><pubDate>Tue, 12 Jul 2011 15:47:58 GMT</pubDate></item></channel></rss>