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

如何使用Pugixml获取包含空白符的完整坐标字符串?

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 11:39:28