正确加载XML需检查LoadFile()返回值及doc.ErrorID(),非零则用ErrorStr()获取错误;读取元素、属性、文本前必须判空;遍历同名子元素用FirstChildElement+NextSiblingElement安全循环;注意编译选项一致和UTF-8 BOM问题。
用 TinyXML2 解析 XML 文件,只要确保链接正确、检查返回值、别直接解引用空指针,就能跑通——否则大概率崩溃或读不到内容。
如何正确加载 XML 文件并检查是否成功
TinyXML2 的 LoadFile() 不抛异常,失败只返回 tinyxml2::XML_SUCCESS 或错误码,必须手动判断。常见疏忽是调用完就直接访问根节点,结果 doc.FirstChildElement() 返回 nullptr,一解引用就段错误。
- 始终用
doc.ErrorID()判断加载状态,非零值说明出错(如文件不存在、格式非法) - 用
doc.ErrorStr()获取具体错误描述,比盲猜快得多 - 路径要用正斜杠或双反斜杠,Windows 下写成
"config.xml"比"config.xml"更稳妥(避免转义问题)
如何安全读取元素内容和属性
所有 FirstChildElement()、Attribute()、GetText() 都可能返回 nullptr,TinyXML2 不做空值防护。比如 elem->Attribute("id") 在属性不存在时返回 nullptr,直接传给 std::string 构造函数会触发未定义行为。
- 读属性前先判空:
const char* id = elem->Attribute("id"); if (id) { /* 使用 id */ } - 读文本内容也一样:
const char* text = elem->GetText(); if (text) { std::string s(text); } - 需要默认值时,别用三目运算符硬套,容易漏掉
nullptr判断;建议封装小函数,如SafeText(elem, "default")
如何遍历同名子元素(比如多个 )
新手常误用 FirstChildElement("item") 只拿第一个,或用 NextSiblingElement("item") 却没检查返回值,导致循环跳过、死循环或崩溃。