记录一下遇到的坑
由于tinyxml中返回值没有错误代码,函数bool TiXmlDocument::LoadFile( TiXmlEncoding encoding )
返回值是bool没有错误代码,导致问题不好找。
目前遇到的主要有3个可能原因。
1.文件名写错
TiXmlDocument* myDoc = new TiXmlDocument(fileName.c_str());
需要检查fileName是否真的存在,复制粘贴错误等低级错误。
另外就是项目当前工作路径是否在你认为的路径下,即:在使用相对路径在拼接时是不是出问题了。
2.文件格式问题
文件路径没问题之后就要检查是不是xml格式有问题。
目测一下或者使用在线网站把文件放进去试试。
在线网站可以点这里
类似网站有很多,一般格式有问题会提示错误位置。改好就可以。
3.隐藏坑-编码
最后是遇到的究极隐藏坑!找了好几个在线网站查了xml格式都没有问题,但是LoadFile()就是报错。最后找到的原因是和编码有关系。key,value中有汉字的时候才会出现,并且在线检查没有编码格式是检查不出来的,很坑。
起因是开始文件是用txt格式打开且保存过,文件->另存为,格式选择ANSI,这样再读取的时候就成功了。
注意:方法3不一定有用,当时也试了其他编码格式utf-8、utf-16be等。也不好用。
实在不行把key,value换成英文吧。
建议:别用txt打开xml,尤其别保存。
如果修改文件编码格式不管用,可以尝试代码里修改读取文件时的编码
代码如下:
//1
myDoc->LoadFile(TIXML_ENCODING_LEGACY);
//2
myDoc->LoadFile(TIXML_ENCODING_UTF8);
上面两种方法直接指定加载文件时读取模式,如果文件语法没什么问题的话一般就能解决了。
另外推荐一下参考文章
tinyxml解析UTF-8字符集的xml
http://skew.org/xml/tutorial