Ошибка выполнения при доступе к элементу tinyXML

вчера была моя первая попытка. Я пытаюсь поймать переменную «время» в следующем файле «new.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>

Вот мой код

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

Но я получаю ошибки времени выполнения из третьей и четвертой строк. Кто-нибудь может пролить свет на этот вопрос?


person prabhakaran    schedule 12.11.2010    source источник
comment
+1 за хорошо поставленный вопрос   -  person Steve Townsend    schedule 12.11.2010
comment
@ Джим, я получил следующее сообщение о необработанном исключении win-32.   -  person prabhakaran    schedule 13.11.2010


Ответы (3)


Мне кажется, что вы забыли загрузить файл. Обычно я делаю что-то в этом роде:

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
} 

Надеюсь это поможет

person BOMEz    schedule 12.11.2010
comment
Вы правы, я забыл запустить функцию LoadFile. - person prabhakaran; 13.11.2010

#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();
    }
}

Вот как это работает. Скомпилировано и протестировано.
Как вы можете видеть, ваши попытки сделать код более безопасным стоили вам исключения в третьей строке (вопроса), и без тестирования я могу поспорить, что это «указывает на ноль». исключение.

Просто загрузите его в моем стиле, как говорится в документации TinyXml: "docHandle.FirstChild("main").FirstChild("ToDo").ToElement();".

Надеюсь, это поможет вам понять, дайте мне знать, если это не ясно. Я принимаю визу (:

person Poni    schedule 12.11.2010
comment
без тестирования я могу поспорить, что это исключение, указывающее на ноль. Эти строки потрясающие и совершенно правильные. - person prabhakaran; 13.11.2010

Мне кажется, или версия pugixml выглядит намного лучше?

#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;
}

Также у new.xml была ошибка, а не:

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

должно быть

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

Компиляция была просто делом cl test.cpp pugixml.cpp

person Cristian Adam    schedule 12.11.2010
comment
В связи с тем, что у меня не хватает времени на мой текущий проект, я не могу проверить вашу идею. Но, спасибо за это. Обязательно проверю. - person prabhakaran; 13.11.2010