libxml2 получить смещение в XML-текст узла - PullRequest
0 голосов
/ 24 апреля 2019

Мне нужно знать, при каком смещении в строку xml определенный произвольный узел где-то в dom можно найти после того, как xmlReadMemory был использован для получения dom.Проблема в том, что я не могу понять, откуда взять xmlParserCtxtPtr для передачи в качестве первого аргумента xmlParserFindNodeInfo, потому что весь мой процесс синтаксического анализа не дает такого контекста;только xmlDoc.

1 Ответ

0 голосов
/ 25 апреля 2019

Следующий код работал для меня (документация на libxml2 оставляет желать лучшего, пришлось загружать исходный код и копаться в lib, пока я не понял достаточно, чтобы взломать это вместе). Ключ:

xmlSetFeature(ctxt, "gather line info", (void *)&v);

Вот код для иллюстрации:

const char *xml = ...
xmlParserCtxt *ctxt = NULL;
xmlDoc *doc = NULL;
if (!(ctxt = xmlCreateDocParserCtxt((const unsigned char *)xml)))
    return -1;
int v = 1;
xmlSetFeature(ctxt, "gather line info", (void *)&v);
if (xmlParseDocument(ctxt) == -1)
{
    xmlFreeParserCtxt(ctxt);
    return -1;
}
else
{
    if ((ctxt->wellFormed) || ctxt->recovery)
        doc = ctxt->myDoc;
    else
    {
        xmlFreeParserCtxt(ctxt);
        return -1;
    }
}

// use doc to get a node and then xmlParserFindNodeInfo(ctxt, node)
…

xmlFreeParserCtxt(ctxt);
...