Ошибка выполнения с доступом к элементу 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