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

Вчерашний день был моей первой попыткой. Я пытаюсь поймать переменную "time" в следующем файле "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");

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

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
} 

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

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

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

Это только у меня или версия 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

Другие вопросы по тегам