将 `htmlDocPtr` 写入字符串

Write `htmlDocPtr` to String

我正在尝试解析一个 HTML 字符串,然后再次将其写出来(为了简洁起见,我省略了我希望执行的转换)。

#include <iostream>
#include <libxml/HTMLparser.h>

static const char *html = "<!DOCTYPE html><html><head></head><body><div></div></body></html>";

int main(int argc, const char * argv[]) {
    xmlChar *buff;
    int buffersize;

    htmlDocPtr doc = htmlReadMemory(html, (unsigned)strlen(html), "noname.html", NULL, 0);
    xmlDocDumpFormatMemory(doc, &buff, &buffersize, 1);

    printf("%s", (char *) buff);

    xmlFree(buff);
    xmlFreeDoc(doc);

    return 0;
}

(我在 C++ 领域几乎是 100% 的绿色 - 请原谅任何支出错误)

这一切都有效(因为它不会出错),但是 xmlDocDumpFormatMemory 将树视为 XML 并相应地输出:

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html>
<html>
  <head/>
  <body>
    <div/>
  </body>
</html>

如您所见,在doctype上方添加了一个XML声明,并且空标签已经被自动关闭。据我所知,没有 htmlDocDumpFormatMemory - 有我可以使用的选项或替代功能吗?

试试下面的代码。它使用 xmlSaveToXXXX 函数(在本例中为 xmlSaveToBuffer),它允许传递 options,例如 XML_SAVE_NO_DECL:

#include <iostream>
#include <libxml/HTMLparser.h>
#include <libxml/xmlsave.h>

static const char *html = "<!DOCTYPE html><html><head></head><body><div></div></body></html>";

int main(int argc, const char * argv[]) {

    htmlDocPtr doc = htmlReadMemory(html, (unsigned)strlen(html), "noname.html", NULL, 0);

    xmlBufferPtr buffer = xmlBufferCreate();
    if (buffer ==  NULL)
        return 1;  // Add error handling...

    xmlSaveCtxtPtr saveCtxtPtr = xmlSaveToBuffer(buffer,NULL, XML_SAVE_NO_DECL);
    if (xmlSaveDoc(saveCtxtPtr, doc) < 0)
        return 1;  // Add error handling

    xmlSaveClose(saveCtxtPtr);

    const xmlChar *xmlCharBuffer = xmlBufferContent(buffer);

    printf("%s", xmlCharBuffer);

    xmlBufferFree(buffer);
    xmlFreeDoc(doc);

    return 0;
}

它产生以下输出:

<!DOCTYPE html>
<html><head></head><body><div></div></body></html>