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

使用pugixml解析XML遇疑问:非标准格式是否合法及解析方法

问题解答

1. Case #1的XML是否合法?

是合法的XML,但你误解了内容结构:Value='Here' Result='1'并不是<Response>元素的属性,而是该元素的文本内容。XML规范中,属性必须写在起始标签的尖括号内部(如Case #2的写法),起始标签与结束标签之间的内容属于节点的文本节点。

2. 如何用pugixml解析获取对应值?

由于这些键值对是文本内容而非属性,你需要先提取<Response>节点的文本,再自行解析其中的键值对。修改后的代码示例如下:

#include <iostream>
#include <sstream>
#include <string>
#include "pugixml.hpp"

int main() {
    const char* xml_string = "<Response> Value='Here' Result='1' </Response>";

    pugi::xml_document doc;
    pugi::xml_parse_result result = doc.load_string(xml_string);

    if (!result) {
        std::cerr << "XML parsing error: " << result.description() << std::endl;
        return 1;
    }

    pugi::xml_node Response = doc.child("Response");

    if (!Response) {
        std::cerr << "Error: Root element 'Response' not found" << std::endl;
        return 1;
    }

    std::cout << "Element name: " << Response.name() << std::endl;

    // 提取节点文本并解析键值对
    std::string text_content = Response.text().get();
    std::istringstream text_stream(text_content);
    std::string token;

    while (text_stream >> token) {
        size_t equal_pos = token.find('=');
        if (equal_pos != std::string::npos) {
            std::string key = token.substr(0, equal_pos);
            std::string value = token.substr(equal_pos + 1);

            // 移除值两端的单/双引号
            if (value.size() >= 2 && ((value.front() == '\'' && value.back() == '\'') || (value.front() == '"' && value.back() == '"'))) {
                value = value.substr(1, value.size() - 2);
            }

            std::cout << "Parsed: " << key << "=\"" << value << "\"" << std::endl;
        }
    }

    return 0;
}

代码说明:

  • 用Response.text().get()获取<Response>节点的文本内容;
  • 通过字符串流按空格分割文本,得到每个Key='Value'格式的片段;
  • 对每个片段分割键和值,移除值两端的引号,最终提取出目标键值对。

这是无法控制XML输入格式时的折中方案,原XML写法不符合常规属性定义规范,只能手动解析文本内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:59:53