Ошибка выполнения с доступом к элементу tinyXML - PullRequest
4 голосов
/ 12 ноября 2010

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

2 голосов
/ 12 ноября 2010

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

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
} 

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

0 голосов
/ 12 ноября 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

0 голосов
/ 12 ноября 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 ();".

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

...