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

如何从XML中提取多值并解析为数组(Qt实现)

批量提取XML中多个节点数据到数组(Qt QDomDocument实现)

1. 定义数据存储结构

根据需求选择两种存储方式:

结构体方式(类型安全,适合固定字段)

struct EntryData {
    QString operId;
    QString workplaceId;
    // 按需添加其他字段,如Name、CreateTime等
};

QVariantMap方式(灵活,适合字段不固定场景)

无需提前定义结构,直接用键值对存储:

QVariantMap entryMap;

2. 批量遍历并提取数据

核心逻辑:先获取所有<entry>节点,逐个解析节点下的<m:properties>,提取目标字段后存入QList数组。

完整代码示例(结构体版)

// xmlResponse为API返回的XML字符串
QDomDocument xmlDoc;
if (!xmlDoc.setContent(xmlResponse)) {
    qDebug() << "XML解析失败";
    return;
}

// 获取所有<entry>节点
QDomNodeList entryNodes = xmlDoc.elementsByTagName("entry");
QList<EntryData> entryDataList; // 存储所有entry数据的数组

// 遍历每个entry节点
for (int i = 0; i < entryNodes.count(); ++i) {
    QDomElement entryElem = entryNodes.at(i).toElement();
    if (entryElem.isNull()) continue;

    // 处理命名空间:根据XML实际的命名空间声明调整URI
    const QString metadataNs = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
    QDomNodeList propertiesNodes = entryElem.elementsByTagNameNS(metadataNs, "properties");
    if (propertiesNodes.isEmpty()) continue;
    QDomElement propertiesElem = propertiesNodes.at(0).toElement();

    EntryData data;
    // 提取Oper_Id
    QDomElement operIdElem = propertiesElem.firstChildElement("Oper_Id");
    if (!operIdElem.isNull()) {
        data.operId = operIdElem.text().trimmed();
    }
    // 提取Workplace_Id
    QDomElement workplaceIdElem = propertiesElem.firstChildElement("Workplace_Id");
    if (!workplaceIdElem.isNull()) {
        data.workplaceId = workplaceIdElem.text().trimmed();
    }
    // 提取其他字段...

    entryDataList.append(data);
}

// 示例:遍历数组验证数据
for (const auto& entry : entryDataList) {
    qDebug() << "Oper_Id:" << entry.operId << "Workplace_Id:" << entry.workplaceId;
}

关键注意事项

  • 命名空间处理:如果XML中<m:properties>带有命名空间前缀(如xmlns:m="xxx"),必须用elementsByTagNameNS指定命名空间URI查找,否则会找不到节点。
  • 空节点判断:每个字段提取前需判断节点是否为空,避免空指针异常。
  • 数据清洗:用trimmed()去除文本前后空格,保证数据整洁。

3. QVariantMap版简化实现

如果字段不固定或需要灵活扩展,可改用QVariantMap存储:

QList<QVariantMap> entryMapList;

for (int i = 0; i < entryNodes.count(); ++i) {
    QDomElement entryElem = entryNodes.at(i).toElement();
    if (entryElem.isNull()) continue;

    QDomElement propertiesElem = entryElem.elementsByTagNameNS(metadataNs, "properties").at(0).toElement();
    QVariantMap dataMap;

    dataMap["Oper_Id"] = propertiesElem.firstChildElement("Oper_Id").text().trimmed();
    dataMap["Workplace_Id"] = propertiesElem.firstChildElement("Workplace_Id").text().trimmed();
    // 添加其他字段...

    entryMapList.append(dataMap);
}

内容的提问来源于stack exchange,提问作者Gia Huy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:40:11