TinyXml: probleme beim attribut auslesen
-
also, ich wollte folgende testdatei auslesen:
<?xml version="1.0" ?> <Datenbank > <person id="0" > <name > max </name> <alter > 18 </alter> </person> ... </Datenbank>die datei wird fehlerfrei geparst, alle subnodes werden ausgelesen, auch die werte der subnodes, aber die attribute werden nicht übernommen:
void copy(BaseNode& node,const TiXmlNode* element,TagTree& tree){ switch(element->Type()) { case TiXmlNode::ELEMENT: { const TiXmlElement* elem=element->ToElement(); //copy attributes for(const TiXmlAttribute* pos=elem->FirstAttribute();pos;pos=pos->Next()){ //hier geht er nie rein! node.getAttributes().insert(pos->Name(),pos->Value()); } //hier werden nun noch namen, und kinder kopiert, das funktioniert //... }weis jemand,was ich falsch gemacht hab? laut doku sollte das so stimmen...
-
Hi,
könnte es sein, dass deine Abbruchbedingung nich korrekt ist? Müsstest du nicht zumindest eine Prüfung auf NULL durchführen?
Ich würde an deiner Stelle mal so etwas ausprobieren:
//copy attributes TiXmlAttribute *pos=elem->FirstAttribute(); while (pos != 0) { node.getAttributes().insert(pos->Name(),pos->Value()); pos = pos->Next(); }Es ist sowieso verwunderlich, dass das Programm nicht abbricht, denn du weist in der Schleife einem const Element einen neuen Wert zu. Das darf doch gar nicht gehen. Denn const ist ja als Schreibschutz gedacht!
Gruß Mea
-
const TiXmlElement*das ist ein Zeiger auf const objekt, selbst ist es veränderbar!
einen const zeiger definiert man so
TiXmlElement* constkönnte es sein, dass deine Abbruchbedingung nich korrekt ist? Müsstest du nicht zumindest eine Prüfung auf NULL durchführen?
ich prüfe auf NULL. schau dir die mittlere bedingung an:
for(...;pos;...){}ist dasselbe wie
for(...;pos!=NULL;...){}Syntaktisch ist das korrekt(der compielr stimmt mir zu). semantisch scheint da etwas nicht in ordnung zu sein.
-
Funktioniert das Auslesen oder das Einfügen nicht? Gibt getAttributes() eventuell eine Kopie zurück?
-
er kommt nichtmal rein. er betritt nie das innere der schleife.
-
habs grad nochmal überprüft, und elem->FirstAttribute() gibt immer 0 zurück

-
so, ich bin jetzt ein stück weiter:
enum->Attribute("id"); findet ein Attribut.
enum->FirstAttribute(); findet keins.ich hab nun sehr lange gerätselt und hab mich nun bis in den code von TinyXML vorgekämpft.
beim aufruf von Attribute("id") werden folgende funktionen aufgerufen:
const char * TiXmlElement::Attribute( const char * name ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( node ) return node->Value(); return 0; } //die von attribute aufgerufene find funktion TiXmlAttribute* TiXmlAttributeSet::Find( const char * name ) { TiXmlAttribute* node; for( node = sentinel.next; node != &sentinel; node = node->next ) { if ( node->name == name ) return node; } return 0; }FirstAttribute() benutzt folgenden code
const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } const TiXmlAttribute* First() const { return ( sentinel.next != &sentinel ) ? sentinel.next : 0; }was ich mich jetzt frage ist, wieso der vergleich einmal false und einmal true ergibt. Zwischen den aufrufen passiert nichts, aber im einen fall läuft die schleife durch, im andren ergibt der Vergleich false.
vielleicht siehts ja spontan jemand, aber ich komm einfach nicht drauf.