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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:07:55