Преобразуйте результат pugixml.смещение к столбцу / строке


Мне нужен удобный отчет об ошибках для приложения, которое использует pugixml.
В настоящее время я использую результат.сдвиг.
Есть ли способ получить строку и столбец вместо этого? Я потенциально имею дело с большими XML-файлами, если это имеет значение.

1 3

1 ответ:

Эта функция не всегда доступна в pugixml, так как это относительно дорого сделать на каждом парсинге, и после завершения парсинга невозможно восстановить информацию о файле/строке в общем случае.

Вот фрагмент, который строит отображение строки offset ->, которое можно использовать в случае сбоя синтаксического анализа или необходимости получения информации по другим причинам; не стесняйтесь настраивать файловый код ввода-вывода в соответствии с вашими требованиями.

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