<?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[tinyxml - iterieren durch die xml]]></title><description><![CDATA[<p>Ich hab eine Klasse XMLObject, die hauptsächlich das Laden und Speichern von XML als Objekthierarchie übernehmen soll. Mein Problem ist, dass nur das erste gefundene Element analysiert wird:</p>
<pre><code>&lt;?xml version=1.0&gt;
&lt;elementa&gt;
 &lt;elementaa1&gt;
  &lt;elementaa1a&gt;wert&lt;/elementaa1a&gt;
  &lt;elementaa1b&gt;wert&lt;/elementaa1b&gt;
  &lt;elementaa1c&gt;wert&lt;/elementaa1c&gt;
 &lt;/elementaa1&gt;
 &lt;elementaa2&gt;
  &lt;elementaa2a&gt;wert&lt;/elementaa2a&gt;
 &lt;/elementaa2&gt;
&lt;/elementa&gt;
</code></pre>
<p>In diesem Falle wird nur elementaa1 mit allen unterelementen(!) abgehandelt..</p>
<p>hier mein Code:</p>
<pre><code class="language-cpp">void XMLObject::createDocument () {
    if (this-&gt;doc != NULL)
        delete doc;
    TiXmlDeclaration * decl = new TiXmlDeclaration( &quot;1.0&quot;, &quot;&quot;, &quot;&quot; );
    this-&gt;doc       = new TiXmlDocument();
    doc-&gt;LinkEndChild(decl);
    doc-&gt;LinkEndChild(myNode);
}

int XMLObject::load (string filename) {
    this-&gt;createDocument();
    doc-&gt;LoadFile(filename.c_str());
    // file doesn't exist
    if (!doc-&gt;LoadFile()) {
        return -1;
    }
    doc-&gt;Print();
    this-&gt;myNode = doc-&gt;FirstChild(&quot;adventure&quot;);
    //string value = this-&gt;myNode-&gt;Value();

    read ();
    return 0;
}

bool XMLObject::handleNode(TiXmlNode * pNode) {
    return false;
    return 0;
}

void XMLObject::read () {
    TiXmlNode *elem = this-&gt;myNode-&gt;FirstChild();
    while(elem) {
        cout &lt;&lt; &quot;Pruefe element &quot; &lt;&lt; elem-&gt;Value() &lt;&lt; endl;
        for (elem; elem;  elem = elem-&gt;NextSibling())
        if (! handleNode (elem)) {
            cout &lt;&lt; elem-&gt;Value() &lt;&lt; &quot; als Variablen hinzugefuegt. &quot; &lt;&lt; endl;
            this-&gt;elements.push_back(elem);
        }

    }
}
</code></pre>
<p>das handleNode ist virtual, eine abgeleitete Klasse sieht so aus:</p>
<pre><code class="language-cpp">bool Adventure::handleNode(TiXmlNode *pNode) {
    string value = pNode-&gt;Value();
    if (value == &quot;switch&quot;) {
        // create switch
        this-&gt;addChild(XMLObject::ptr(new Switch(pNode)));
        return true;
    } else if (value == &quot;item&quot;) {
        // create item
        this-&gt;addChild(XMLObject::ptr(new Item(pNode)));
        return true;
    } else if (value == &quot;room&quot;) {
        // create room
        this-&gt;addChild(XMLObject::ptr(new Room(pNode)));
        return true;
    }
    return false;    
}
</code></pre>
<p>Das print im load liefert mir die komplette hierarchie.<br />
Beim Save wird wieder nur das erste Child abgearbeitet.<br />
Kann mir wer erklären, was da jetzt hakt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203924/tinyxml-iterieren-durch-die-xml</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 03:58:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203924.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Jan 2008 10:34:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to tinyxml - iterieren durch die xml on Mon, 28 Jan 2008 11:48:59 GMT]]></title><description><![CDATA[<p>Ich hab eine Klasse XMLObject, die hauptsächlich das Laden und Speichern von XML als Objekthierarchie übernehmen soll. Mein Problem ist, dass nur das erste gefundene Element analysiert wird:</p>
<pre><code>&lt;?xml version=1.0&gt;
&lt;elementa&gt;
 &lt;elementaa1&gt;
  &lt;elementaa1a&gt;wert&lt;/elementaa1a&gt;
  &lt;elementaa1b&gt;wert&lt;/elementaa1b&gt;
  &lt;elementaa1c&gt;wert&lt;/elementaa1c&gt;
 &lt;/elementaa1&gt;
 &lt;elementaa2&gt;
  &lt;elementaa2a&gt;wert&lt;/elementaa2a&gt;
 &lt;/elementaa2&gt;
&lt;/elementa&gt;
</code></pre>
<p>In diesem Falle wird nur elementaa1 mit allen unterelementen(!) abgehandelt..</p>
<p>hier mein Code:</p>
<pre><code class="language-cpp">void XMLObject::createDocument () {
    if (this-&gt;doc != NULL)
        delete doc;
    TiXmlDeclaration * decl = new TiXmlDeclaration( &quot;1.0&quot;, &quot;&quot;, &quot;&quot; );
    this-&gt;doc       = new TiXmlDocument();
    doc-&gt;LinkEndChild(decl);
    doc-&gt;LinkEndChild(myNode);
}

int XMLObject::load (string filename) {
    this-&gt;createDocument();
    doc-&gt;LoadFile(filename.c_str());
    // file doesn't exist
    if (!doc-&gt;LoadFile()) {
        return -1;
    }
    doc-&gt;Print();
    this-&gt;myNode = doc-&gt;FirstChild(&quot;adventure&quot;);
    //string value = this-&gt;myNode-&gt;Value();

    read ();
    return 0;
}

bool XMLObject::handleNode(TiXmlNode * pNode) {
    return false;
    return 0;
}

void XMLObject::read () {
    TiXmlNode *elem = this-&gt;myNode-&gt;FirstChild();
    while(elem) {
        cout &lt;&lt; &quot;Pruefe element &quot; &lt;&lt; elem-&gt;Value() &lt;&lt; endl;
        for (elem; elem;  elem = elem-&gt;NextSibling())
        if (! handleNode (elem)) {
            cout &lt;&lt; elem-&gt;Value() &lt;&lt; &quot; als Variablen hinzugefuegt. &quot; &lt;&lt; endl;
            this-&gt;elements.push_back(elem);
        }

    }
}
</code></pre>
<p>das handleNode ist virtual, eine abgeleitete Klasse sieht so aus:</p>
<pre><code class="language-cpp">bool Adventure::handleNode(TiXmlNode *pNode) {
    string value = pNode-&gt;Value();
    if (value == &quot;switch&quot;) {
        // create switch
        this-&gt;addChild(XMLObject::ptr(new Switch(pNode)));
        return true;
    } else if (value == &quot;item&quot;) {
        // create item
        this-&gt;addChild(XMLObject::ptr(new Item(pNode)));
        return true;
    } else if (value == &quot;room&quot;) {
        // create room
        this-&gt;addChild(XMLObject::ptr(new Room(pNode)));
        return true;
    }
    return false;    
}
</code></pre>
<p>Das print im load liefert mir die komplette hierarchie.<br />
Beim Save wird wieder nur das erste Child abgearbeitet.<br />
Kann mir wer erklären, was da jetzt hakt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1444918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1444918</guid><dc:creator><![CDATA[DocJunioR]]></dc:creator><pubDate>Mon, 28 Jan 2008 11:48:59 GMT</pubDate></item><item><title><![CDATA[Reply to tinyxml - iterieren durch die xml on Mon, 28 Jan 2008 10:41:30 GMT]]></title><description><![CDATA[<p>P.S.: Bitte entschuldigt die Kommentarfreiheit, aber ich bin grad auf ner Kiste beschäftigt, wo jedes Tippen ein Gräuel ist.. Ich wills erstmal am Laufen haben..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1444926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1444926</guid><dc:creator><![CDATA[DocJunioR]]></dc:creator><pubDate>Mon, 28 Jan 2008 10:41:30 GMT</pubDate></item><item><title><![CDATA[Reply to tinyxml - iterieren durch die xml on Mon, 28 Jan 2008 10:48:36 GMT]]></title><description><![CDATA[<p>Ich verstehe das Problem noch nicht so ganz.</p>
<p>Ist dein Problem, dass zum Beispiel &lt;elementaa1a&gt; nicht behandelt wird? Falls ja, du läufst ja auch nur eine Ebene darüber durch das XML File. So tief gehst du ja nicht.</p>
<p>Rekursiv lässt es sich wunderbar lösen, bis in den letzten Winkel der XML Datei runterzulaufen.</p>
<p>Oder ist dein Problem etwa bei einem solchen XMl File</p>
<pre><code>&lt;?xml version=&quot;1.0&quot; ?&gt;
&lt;elementa&gt;
     ...
&lt;/elementa&gt;
&lt;elementb&gt;
     ...
&lt;/elementb&gt;
</code></pre>
<p>&lt;elementb&gt; nie behandelt wird? Wenn das der Fall ist: das ist kein gültiges XML File. Es darf nur ein erstes Element geben. Was tinyxml dann genau macht, weiß ich allerdings nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1444936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1444936</guid><dc:creator><![CDATA[Tobias W]]></dc:creator><pubDate>Mon, 28 Jan 2008 10:48:36 GMT</pubDate></item><item><title><![CDATA[Reply to tinyxml - iterieren durch die xml on Mon, 28 Jan 2008 11:50:07 GMT]]></title><description><![CDATA[<p>nein, so wie es <strong>jetzt</strong> steht. elementaa1 wird abgearbeitet, elementaa2 nicht.<br />
sorry, hatte mich etwas vertippt</p>
<p>quasi tut das ding so, als ob dieses hier der einzige Inhalt der Datei wäre</p>
<pre><code>&lt;elementa&gt;
 &lt;elementaa1&gt;
  &lt;elementaa1a&gt;wert&lt;/elementaa1a&gt;
  &lt;elementaa1b&gt;wert&lt;/elementaa1b&gt;
  &lt;elementaa1c&gt;wert&lt;/elementaa1c&gt;
 &lt;/elementaa1&gt;
&lt;/elemanta&gt;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1444985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1444985</guid><dc:creator><![CDATA[DocJunioR]]></dc:creator><pubDate>Mon, 28 Jan 2008 11:50:07 GMT</pubDate></item><item><title><![CDATA[Reply to tinyxml - iterieren durch die xml on Mon, 28 Jan 2008 11:54:48 GMT]]></title><description><![CDATA[<p>Ah, ich glaub ich seh den Fehler:</p>
<pre><code class="language-cpp">void XMLObject::read () {
    TiXmlNode *elem = this-&gt;myNode-&gt;FirstChild();
    while(elem) {
        cout &lt;&lt; &quot;Pruefe element &quot; &lt;&lt; elem-&gt;Value() &lt;&lt; endl;
        for (elem; elem;  elem = elem-&gt;NextSibling())
        if (! handleNode (elem)) {
            cout &lt;&lt; elem-&gt;Value() &lt;&lt; &quot; als Variablen hinzugefuegt. &quot; &lt;&lt; endl;
            this-&gt;elements.push_back(elem);
        }

    }
}
</code></pre>
<p>In der for()-Schleife läufst du durch die Elemente a,b,c durch (also die &quot;ganz weit unten&quot;). Du nutzt dafür TiXmlNode *elem. Nach dem Element c wird elem == NULL, und damit bricht auch die while()-Schleife ab.</p>
<p>Probiers mal so (<em>ungetestet</em>):</p>
<pre><code class="language-cpp">void XMLObject::read () {
    TiXmlNode *elem = this-&gt;myNode-&gt;FirstChild();
    while(elem) {
        cout &lt;&lt; &quot;Pruefe element &quot; &lt;&lt; elem-&gt;Value() &lt;&lt; endl;
        for (TiXmlNode* elem2 = elem; elem2;  elem2 = elem2-&gt;NextSibling())
        if (! handleNode (elem2)) {
            cout &lt;&lt; elem2-&gt;Value() &lt;&lt; &quot; als Variablen hinzugefuegt. &quot; &lt;&lt; endl;
            this-&gt;elements.push_back(elem2);
        }
        elem = elem-&gt;NextSibling();

    }
}
</code></pre>
<p>Schöner ist es eventuell mit 2 for()-Schleifen. Aber funktionieren sollte es eigentlich auch so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1444999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1444999</guid><dc:creator><![CDATA[Tobias W]]></dc:creator><pubDate>Mon, 28 Jan 2008 11:54:48 GMT</pubDate></item><item><title><![CDATA[Reply to tinyxml - iterieren durch die xml on Mon, 28 Jan 2008 13:43:44 GMT]]></title><description><![CDATA[<p>hmm.. also mein Code ist eh scheinbar eine kaputte Version zwischen zwei Ständen.<br />
So siehts jetzt aus:</p>
<pre><code class="language-cpp">void XMLObject::read () {
    TiXmlNode *elem = this-&gt;myNode-&gt;FirstChild();
    while(elem) {
        cout &lt;&lt; &quot;Pruefe element &quot; &lt;&lt; elem-&gt;Value() &lt;&lt; endl;
        if (! handleNode (elem)) {
            cout &lt;&lt; elem-&gt;Value() &lt;&lt; &quot; als Variablen hinzugefuegt. &quot; &lt;&lt; endl;
            this-&gt;elements.push_back(elem);
        }
        elem = elem-&gt;NextSibling();
    }
}
</code></pre>
<p>Ich hab aber gerade etwas interessantes herausgefunden. Wenn ich das doc-&gt;Print() nach dem read() (load-&gt;Methode) starte, ist tatsächlich auch nur noch das im Dokument enthalten, was read ausliest.<br />
Irgendwie gehen meine Daten im Nirvana verschütt, noch bevor ich sie handlen kann..</p>
<p>Woran das liegt kann ich mir einfach nicht erklären. Werde mal weiter forschen.<br />
Kennt jemand einen entsprechenden bug in TinyXML 2.3.4 (DevPack)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445081</guid><dc:creator><![CDATA[DocJunioR]]></dc:creator><pubDate>Mon, 28 Jan 2008 13:43:44 GMT</pubDate></item><item><title><![CDATA[Reply to tinyxml - iterieren durch die xml on Mon, 28 Jan 2008 13:48:07 GMT]]></title><description><![CDATA[<p>DocJunioR schrieb:</p>
<blockquote>
<p>P.S.: Bitte entschuldigt die Kommentarfreiheit, aber ich bin grad auf ner Kiste beschäftigt, wo jedes Tippen ein Gräuel ist.. Ich wills erstmal am Laufen haben..</p>
</blockquote>
<p>Was ist Kommentarfreiheit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445086</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Mon, 28 Jan 2008 13:48:07 GMT</pubDate></item><item><title><![CDATA[Reply to tinyxml - iterieren durch die xml on Mon, 28 Jan 2008 14:04:15 GMT]]></title><description><![CDATA[<p>ich bat nur um entschuldigung dafür, dass mein Code unkommentiert, quasi Kommentarfrei ist. Und äeh,, ja. Ich rede immer so blödsinnig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445098</guid><dc:creator><![CDATA[DocJunioR]]></dc:creator><pubDate>Mon, 28 Jan 2008 14:04:15 GMT</pubDate></item><item><title><![CDATA[Reply to tinyxml - iterieren durch die xml on Mon, 28 Jan 2008 14:29:32 GMT]]></title><description><![CDATA[<p>Zur Kommentarfreiheit würde ich sagen:<br />
Wenn die variabeln und methoden namen gut gewählt sind, so sind keine Kommentare nötig.</p>
<p>Es geht nicht drum kryptischen Code zu schreiben und dann im Kommentar den zu entschlüsseln. Es sollte so sein, dass der Code lesbar ist und die Idee aus dem Code hervor geht.</p>
<p>Das ist meine Meinung...</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445111</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Mon, 28 Jan 2008 14:29:32 GMT</pubDate></item><item><title><![CDATA[Reply to tinyxml - iterieren durch die xml on Mon, 28 Jan 2008 18:29:57 GMT]]></title><description><![CDATA[<p>Das sehe ich etwas anders..<br />
aber wie löst das jetzt mein Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445259</guid><dc:creator><![CDATA[DocJunioR]]></dc:creator><pubDate>Mon, 28 Jan 2008 18:29:57 GMT</pubDate></item></channel></rss>