0

我最近开始使用 tinyXML。问题是当我运行我的程序来读取 xml 时,它会返回访问冲突。一条常见的线路是:

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

使用 Visual Studio 调试器,我确定它为“地图”返回 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标签,但是当它不起作用时添加它,添加它仍然没有帮助。任何帮助,将不胜感激

4

3 回答 3

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
于 2012-06-20T06:59:29.573 回答
1

就像您在问题的评论中所说的那样,错误代码 3 是file not found 您很可能已经解决了这个问题,但造成这种情况的一个常见原因只是让路径中的反斜杠以错误的方式出现。

我自己也遇到了这个确切的问题。在进行了相当多的 Web 开发之后,由于正在进行不同的脚本/标记/服务器端/客户端 funk,斜线在同一个项目中处于不同方向的环境(有时您需要反转方向)发布时你的一半斜线!),这突然出现了很多。仍然让我难倒了一个小时。

将这个可能的解决方案推迟到很晚以供参考 - 这是在 TinyXML 和这个问题上最突出的谷歌结果。

于 2012-08-07T14:25:38.153 回答
0

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

于 2012-06-20T06:31:13.580 回答