使用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
相关产品推荐
相关产品推荐

