Pugi解析时,定位行号和列号

本文介绍了一种在牺牲部分功能以提高速度的Pugi XML解析器中,通过自定义方法计算节点行列号的技术。该方法利用offset_debug()函数获取节点偏移量,并通过记录每行末尾字符偏移量的方式实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Pugi解析XML很快,主要是因为它牺牲了部分功能,举个简单的例子就是,它不能获取某个节点的行号,列号。

本文提供一种方法,计算出行列号。主要使用pugi中函数offset_debug()。


官方解释:

获取节点的偏移量,单位是 chat_t。

注意下图,红色的话,chat_t分窄字符和宽字符,长度分别为1byte 和2byte。

// Get node offset in parsed file/string (in char_t units) for debugging purposes
ptrdiff_t offset_debug() const;



获取行号的原理:

很简单,通过offse_debug获得字符序号,查找字符序号所在的行。

1.我们把每行的最末尾的字符序号记录下来;(建立一个vector  :build_offset_data)

2.找到那个末尾序号刚大于这个序号的行,取得行号即可。(get_location)


代码:

typedef std::vector<ptrdiff_t> offset_data_t;

bool build_offset_data(offset_data_t& result, const char* file)
{
    FILE* f = fopen(file, "rb");
    if (!f) return false;

    ptrdiff_t offset = 0;

    char buffer[1024];
    size_t size;

    while ((size = fread(buffer, 1, sizeof(buffer), f)) > 0)
    {
    for (size_t i = 0; i < size; ++i)
        if (buffer[i] == '\n')
            result.push_back(offset + i);

    offset += size;
    }

    fclose(f);

    return true;
}

std::pair<int, int> get_location(const offset_data_t& data, ptrdiff_t offset)
{
    offset_data_t::const_iterator it = std::lower_bound(data.begin(), data.end(), offset);
    size_t index = it - data.begin();

    return std::make_pair(1 + index, index == 0 ? offset + 1 : offset - data[index - 1]);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值