4

昨天是我的第一次尝试。我试图在以下“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");

但是我从第三行和第四行得到运行时错误。任何人都可以阐明这个问题吗?

4

3 回答 3

2

在我看来,您忘记加载文件了。通常我会按照以下方式做一些事情:

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
} 

希望这可以帮助

于 2010-11-12T17:55:33.633 回答
0

只是我还是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

于 2010-11-12T18:03:34.347 回答
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();
    }
}

这就是它的工作原理。编译和测试。
正如您所看到的,您尝试使其更加安全的代码在您的第三行(问题的)处花费了您的费用,并且没有测试我可以打赌这是一个“指向空”的异常。

只需加载我的风格,正如 TinyXml 的文档所说:“docHandle.FirstChild("main").FirstChild("ToDo").ToElement();"。

希望能帮助你理解,如果不清楚,请告诉我。我接受签证(:

于 2010-11-12T17:36:34.540 回答