You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TinyXml库读取XML中data属性存储的数组数据的问题咨询

问题场景

你目前使用TinyXml库实现C++数组到XML的导出/导入,导出时将数组转为空格分隔的字符串存入ChunkData节点的data属性,导入时读取该属性解析为数组失败。

现有代码的核心问题
  • 读取posX、posY逻辑错误:QueryIntAttribute返回值是操作错误码,不是属性值,你两次查询都把属性值写入了同一个buffX变量,最终xKey、yKey拿到的都是错误码,会直接导致数组下标越界崩溃。
  • data属性存储的是空格分隔的整数字符串,不是单个整数,调用QueryIntAttribute根本无法正确读取。
  • 野指针问题:&Chunk(sf::Vector2f(xKey,yKey))拿到的是临时对象的地址,临时对象出了当前作用域就会被销毁,后续访问mapChunk元素时会触发非法内存访问。
  • 对TinyXml节点的取值逻辑有误:ChunkData是自闭合节点,没有文本内容,调用GetText()拿不到任何有效数据,所有数据都存储在data属性中。
正确实现代码

读取属性并解析数组的示例代码

elem = hRoot.FirstChild("ChunkBranch").FirstChild().Element();
for (elem; elem; elem = elem->NextSiblingElement())
{
    if (strcmp(elem->Value(), "Chunk") == 0)
    {
        int xVal, yVal;
        // 先判断属性读取是否成功,属性值存在xVal、yVal中
        if (elem->QueryIntAttribute("posX", &xVal) != TIXML_SUCCESS || 
            elem->QueryIntAttribute("posY", &yVal) != TIXML_SUCCESS) {
            continue; // 读取失败跳过当前节点
        }
        // 不要用临时对象地址,这里如果mapChunk存的是对象直接赋值,存指针就new
        mapChunk[xVal][yVal] = new Chunk(sf::Vector2f(xVal, yVal));
        std::cout << "In chunk:\t" << xVal << " x " << yVal<< "\n";

        TiXmlElement* cData = elem->FirstChildElement("ChunkData");
        if (!cData) continue;
        // 直接读取data属性的字符串值
        const char* dataStr = cData->Attribute("data");
        if (!dataStr) continue;

        // 下面是按空格分割字符串转int数组的逻辑
        std::vector<int> dataArr;
        std::stringstream ss(dataStr);
        int num;
        while (ss >> num) {
            dataArr.push_back(num);
        }
        // 把dataArr赋值给对应Chunk对象的数组属性即可
        mapChunk[xVal][yVal]->setChunkData(dataArr);
    }
}

补充说明

如果要优化存储效率,也可以选择把数组序列化后转为Base64字符串存到属性中,避免空格占用额外空间,不过目前的空格分隔方案对于小数据量来说已经足够使用。


内容的提问来源于stack exchange,提问作者Xle6yIIIeK Novarior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:57:04