【问题标题】:TinyXML throwing access violationTinyXML 引发访问冲突
【发布时间】:2012-06-20 03:55:42
【问题描述】:

我最近开始使用 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标签,但是当它不起作用时添加了它,添加它仍然没有帮助。任何帮助将不胜感激

【问题讨论】:

  • doc.LoadFile(...) 返回什么?
  • 永远不要使用函数返回的指针而不检查它们是否返回非空指针。
  • errorCode 为 3,现在查看文档
  • 看起来是找不到文件...即使我在调试目录中的 data/maps/map1.xml 中有它应该从它运行...

标签: c++ tinyxml


【解决方案1】:

改变

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-08
        • 1970-01-01
        • 2017-01-17
        • 1970-01-01
        • 1970-01-01
        • 2018-02-28
        • 1970-01-01
        相关资源
        最近更新 更多