使用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
相关产品推荐
相关产品推荐

