如何使用C++ QDOM元素向已有XML根节点添加子节点?
问题分析与修复
你的核心问题在于非首次调用时的处理逻辑完全错误:
- XML是单根结构,不能用
Append模式直接向文件末尾追加内容,这会导致XML结构无效 - 非首次调用时不需要创建新的
setting根节点,应该读取已有的XML文件,获取已存在的根节点后添加子节点
修复后的代码
// 处理XML文件 if (firstCall) { // 首次调用:创建新文件和文档结构 if (!xmlFile.open(QFile::WriteOnly | QFile::Text)) { qDebug() << "无法打开文件进行写入"; return; } QDomDocument document; QDomElement root = document.createElement("setting"); document.appendChild(root); // 添加setting1节点 QDomElement setting = document.createElement("setting1"); setting.setAttribute("length", "5"); root.appendChild(setting); setting = document.createElement("setting1"); setting.setAttribute("width", "5"); root.appendChild(setting); // 写入文件 QTextStream stream(&xmlFile); stream << document.toString(4); // 4是缩进空格数,美化格式 xmlFile.close(); } else { // 非首次调用:读取已有文件,修改后重新写入 if (!xmlFile.open(QFile::ReadOnly | QFile::Text)) { qDebug() << "无法打开文件进行读取"; return; } QDomDocument document; if (!document.setContent(&xmlFile)) { qDebug() << "解析XML文件失败"; xmlFile.close(); return; } xmlFile.close(); // 获取已存在的根节点 QDomElement root = document.documentElement(); // 直接获取根节点<setting> if (root.isNull()) { qDebug() << "XML文件无有效根节点"; return; } // 添加setting2节点 QDomElement setting = document.createElement("setting2"); setting.setAttribute("length", "5"); root.appendChild(setting); setting = document.createElement("setting2"); setting.setAttribute("width", "5"); root.appendChild(setting); // 重新写入文件(覆盖原有内容) if (!xmlFile.open(QFile::WriteOnly | QFile::Text | QFile::Truncate)) { qDebug() << "无法打开文件进行写入"; return; } QTextStream stream(&xmlFile); stream << document.toString(4); xmlFile.close(); }
关键修复点说明
- 非首次调用时,先以
ReadOnly模式打开文件,用QDomDocument::setContent读取整个XML内容 - 通过
document.documentElement()获取已有的<setting>根节点,不需要重新创建 - 修改完成后,以
WriteOnly | Truncate模式打开文件(覆盖原有内容),写入完整的修改后XML - 使用
QTextStream写入,避免直接拼接字符串导致的格式问题 - 注意属性名的大小写:你原代码里用了
Length/Width,但示例XML里是小写的length/width,保持一致避免不匹配
内容的提问来源于stack exchange,提问作者Seigfred Mondez
相关产品推荐
相关产品推荐

