2010-11-12 21 views
4

hier était ma première tentative. Je suis en train d'attraper la variable « temps » dans ce qui suit « new.xml » fichierErreur d'exécution avec l'accès aux éléments tinyXML

<?xml version="1.0" standalone=no> 
<main> 
<ToDo time="1"> 
    <Item priority="1"> Go to the <bold>Toy store!</bold></Item> 
    <Item priority="2"> Do bills</Item> 
</ToDo> 
<ToDo time="2"> 
    <Item priority="1"> Go to the Second<bold>Toy store!</bold></Item> 
</ToDo> 
</main> 

Voici mon code

TiXmlDocument doc("new.xml"); 
TiXmlNode * element=doc.FirstChild("main"); 
element=element->FirstChild("ToDo"); 
string temp=static_cast<TiXmlElement *>(element)->Attribute("time"); 

mais je reçois les erreurs d'exécution des troisième et quatrième lignes . Quelqu'un peut-il faire la lumière sur cette question?

+2

+1 pour une question bien présentée –

+0

Quelles sont les erreurs d'exécution? –

+1

@Jim J'ai reçu le message suivant "une exception win-32 non gérée" – prabhakaran

Répondre

2

Il me semble que vous avez oublié de charger le fichier Normalement, je fais quelque chose dans ce sens.

TiXmlDocument doc("document.xml"); 
bool loadOkay = doc.LoadFile(); // Error checking in case file is missing 
if(loadOkay) 
{ 
    TiXmlElement *pRoot = doc.RootElement(); 
    TiXmlElement *element = pRoot->FirstChildElement(); 
    while(element) 
    { 
     string value = firstChild->Value(); // In your example xml file this gives you ToDo 
     string attribute = firstChild->Attribute("time"); //Gets you the time variable 
     element = element->NextSiblingElement(); 
    } 
} 
else 
{ 
    //Error conditions 
} 

Hope this helps

+1

Vous avez raison, j'ai oublié d'initier la fonction "LoadFile". – prabhakaran

0
#include "tinyXml/tinyxml.h" 

const char MY_XML[] = "<?xml version='1.0' standalone=no><main> <ToDo time='1'> <Item priority='1'> Go to the <bold>Toy store!</bold></Item> <Item priority='2'> Do bills</Item> </ToDo> <ToDo time='2'> <Item priority='1'> Go to the Second<bold>Toy store!</bold></Item> </ToDo></main>"; 

void main() 
{ 
    TiXmlDocument doc; 
    TiXmlHandle docHandle(&doc); 

    const char * const the_xml = MY_XML; 
    doc.Parse(MY_XML); 

    TiXmlElement* xElement = NULL; 
    xElement = docHandle.FirstChild("main").FirstChild("ToDo").ToElement(); 

    int element_time = -1; 

    while(xElement) 
    { 
     if(xElement->QueryIntAttribute("time", (int*)&element_time) != TIXML_SUCCESS) 
      throw; 

     xElement = xElement->NextSiblingElement(); 
    } 
} 

Voilà comment cela fonctionne. Compilé & testé.
Comme vous pouvez voir vos tentatives pour rendre le code extra-sûr vous coûtera avec une exceotion à votre troisième ligne (de la question), et sans test, je peux parier que c'est une exception "pointant vers zéro". Il suffit de charger mon style, comme le disent les docs de TinyXml: "docHandle.FirstChild (" main "). FirstChild (" ToDo "). ToElement();".

J'espère que cela vous aidera à comprendre, faites le moi savoir si ce n'est pas clair. J'accepte visa (:

+1

"sans test je peux parier que c'est une exception" pointant vers zéro "" Ces lignes sont géniales et exactement correctes – prabhakaran

0

Est-ce juste moi ou la pugixml la version est beaucoup mieux

#include <iostream> 
#include "pugixml.hpp" 

using namespace std; 
using namespace pugi; 

int main() 
{ 
    xml_document doc; 
    if (!doc.load_file("new.xml")) 
    { 
     cerr << "Could not load xml"; 
     return 1; 
    } 
    xml_node element = doc.child("main"); 
    element = element.child("ToDo"); 

    cout << "Time: " << element.attribute("time") << endl; 
} 

également new.xml eu une erreur, au lieu de:

<?xml version="1.0" standalone=no> 

devrait être

<?xml version="1.0" standalone="no"?> 

compilation est juste une question de cl test.cpp pugixml.cpp

+1

Étant donné que je manque de temps pour mon projet actuel, je ne suis pas en mesure de vérifier votre idée. Mais, merci pour cela. Je vais certainement le vérifier. – prabhakaran