将 pugixml 的结果偏移量转换为列/行

Convert pugixml's result.offset to column/line

本文关键字:转换 偏移量 pugixml 结果      更新时间:2023-10-16

我需要为使用 pugixml 的应用程序提供用户友好的错误报告。
我目前正在使用结果偏移量。
有没有办法代替行和列?我可能会处理大型 XML 文件,如果这有所作为的话。

此功能在

pugixml 中并不容易获得,因为在每次解析时执行此操作相对昂贵,并且在解析完成后,在一般情况下无法恢复文件/行信息。

下面是一个代码段,用于构建偏移 -> 行映射,您可以在解析失败或由于其他原因需要信息时使用;请随意调整文件 I/O 代码以满足您的要求。

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]);
}