如何从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
相关产品推荐
相关产品推荐

