如何使用Pugixml获取包含空白符的完整坐标字符串?
嘿,我来帮你搞定这个问题!你遇到的情况根本不是Pugixml的限制,而是两个容易踩的小坑没注意到:一个是XPath选择器写错了,另一个是XML加载时的空白处理选项没设对。咱们一步步来修正:
1. 先把XPath选择器的坑填上
你现在用的是name_node.parent().select_node("//coordinates"),这里的//是全局搜索——意思是从文档根节点开始找所有<coordinates>,然后返回第一个匹配的节点,这就导致你拿到的可能不是和当前<name>同属一个父节点的那个坐标节点!
要改成相对路径,把//coordinates换成.//coordinates(.表示从当前父节点开始往下递归找),如果你的XML结构固定,甚至可以写更精确的路径:./Polygon/outerBoundaryIs/LinearRing/coordinates,这样就能精准定位到和目标<name>配对的坐标节点了。
2. 开启空白保留的加载选项
Pugixml默认的解析模式会自动“规范化”空白字符:比如修剪文本开头/结尾的空白,把连续的空白(包括换行、制表符)合并成单个空格。这就是为什么你只拿到了第一个坐标——不对,其实是你之前的XPath已经拿错了节点,不过即使拿对了,默认选项也可能影响文本内容。
如果要完整保留<coordinates>里的所有空格和原始格式,加载XML时必须加上parse_preserve_whitespace选项,直接在load_file里指定就行。
最后给你修正后的完整代码
顺便还帮你改了一个语法错误(你原来的代码里多了一个右括号))),还有一个容易犯的错:别直接用==比较C风格字符串,要转成std::string再比,不然比的是指针地址不是内容!
#include <iostream> #include <pugixml.hpp> int main() { pugi::xml_document doc; // 关键:添加parse_preserve_whitespace,保留所有空白字符 pugi::xml_parse_result result = doc.load_file( "file.xml", pugi::parse_default | pugi::parse_preserve_whitespace ); if (!result) { std::cout << "XML加载失败:" << result.description() << std::endl; return 1; } pugi::xpath_node_set name_nodes = doc.select_nodes("//name"); for(const auto& xpath_node : name_nodes) { auto name_node = xpath_node.node(); // 转成std::string再比较,避免C风格字符串的指针比较坑 std::string current_name = name_node.text().as_string(); if(current_name == "search_name") { // 用相对路径找当前父节点下的coordinates auto path_node = name_node.parent().select_node(".//coordinates"); if(path_node) { // 现在就能输出完整的坐标字符串了! std::string coord_str = path_node.node().text().as_string(); std::cout << "Coordinate string: " << coord_str << std::endl; } } } return 0; }
额外小提示
如果不想修改全局的加载选项,或者已经加载了文档,也可以直接调用path_node.node().value()来获取原始的未处理的文本内容——这个方法会跳过解析时的空白规范化,直接返回节点的原始文本数据,包括所有空格。不过我还是推荐加载时就指定parse_preserve_whitespace,这样整个解析过程的行为更可控。
这样修改之后,你就能拿到包含所有空格的完整坐标字符串啦!如果还有其他问题,随时提~
内容来源于stack exchange

