将 `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>
我正在尝试解析一个 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>