TinyXML抛出访问冲突

时间:2012-06-20 03:55:43

标签: c++ tinyxml

我最近开始使用tinyXML。问题是当我运行我的程序来读取xml时,它返回一个访问冲突。一个共同点是:

doc.FirstChildElement("Map")->FirstChildElement("Width")->GetText()

使用visual studio调试器,我确定它为'Map'返回null,然后使用null引用来调用函数。

这是第一行代码和xml

XMLDocument doc;
    doc.LoadFile(path.c_str());

    int width = atoi(doc.FirstChildElement("Map")->FirstChildElement("Width")->GetText());

XML:

<?xml version="1.0"?>
 <Master>
 <Map>
    <Width>5</Width>
    <Height>5</Height>
    <Layers>1</Layers>
    <Tiles>
        <Tile>
            <Id>1</Id>
            <Path>data/tiles/dirt-base.png</Path>
        </Tile>
    </Tiles>
    <Data>
        <DataLayer>1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1</DataLayer>
    </Data>
 </Map>
 </Master>

重要的是要注意,我最初没有root标签,但是当它不起作用时添加它,添加它仍然没有帮助。任何帮助将不胜感激

3 个答案:

答案 0 :(得分:3)

更改

int width = atoi(doc.FirstChildElement("Map")->FirstChildElement("Width")->GetText());

int width = atoi(doc.FirstChildElement("Master")->FirstChildElement("Map")->FirstChildElement("Width")->GetText());

它正在我的电脑上使用最新的tinyxml。

根据TinyXml文档

您应首先检查LoadFile返回

if (!_doc.LoadFile(filename))
{
    printf("load file=[%s] failed\n", filename);
    return -1;
}

然后检查元素是否存在以避免访问冲突。

使用TiXmlHandle检查元素更容易。

TiXmlHandle docHandle(&doc);
TiXmlElement* child = docHandle.FirstChild("Map").FirstChild("Width").ToElement();
if (child)
{
    // do something useful

答案 1 :(得分:1)

就像你在问题的评论中所说,错误代码3是file not found 你很可能已经解决了这个问题,但是造成这种情况的一个常见原因就是简单地在路径中使用反斜杠。

我自己就是这个问题。做了相当多的Web开发,在同一个项目中由于不同的脚本/标记/服务器端/客户端funk(以及有时需要反转方向)在发布时你的一半斜线!),这会产生很多。还是让我难过了一个小时。

为了参考起见,最近坚持这个可能的解决方案 - 这是TinyXML上最突出的Google结果和这个问题。

答案 2 :(得分:0)

在我看来,你正在调用的TinyXML函数之一正在返回一个无效指针。尝试分别检查每个呼叫的结果,您将能够确定问题。