2017-01-10 9 views
2

HTML 문자열을 파싱하고 다시 작성하려고합니다 (간결하게하기 위해 수행하려는 변환을 생략했습니다).`htmlDocPtr`을 String으로 씁니다.

#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; 
} 

(I 거의 100 % 록에서 C++ 땅 - 어떤 outlaying 오류를 용서하시기 바랍니다)

이 모든 작업 (그에서 밖으로 오류하지 않습니다)하지만, XML 등 xmlDocDumpFormatMemory 취급 트리 및 그에 따라 출력 :

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

위에서 알 수 있듯이 doctype 위에 XML 선언이 추가되었으며 빈 태그는 자동으로 닫힙니다. 내가 말할 수있는 한, htmlDocDumpFormatMemory은 없습니다 - 사용할 수있는 옵션이나 대체 기능이 있습니까?

답변

3

다음 코드를 시도해보십시오. 이것은, 예를 들면, 같은 options를 통과하도록 (이 경우 xmlSaveToBuffer 등) xmlSaveToXXXX -functions, 이용한다 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> 
+0

유사한 근무 마약 중독 ** ** 매력, 그리고 완전히 다른 질문이 될 내 공백을 보존! –

+0

'XML_SAVE_AS_HTML'과'XML_SAVE_XHTML'과 같은 [유용한 옵션] (http://www.xmlsoft.org/html/libxml-xmlsave.html#xmlSaveOption)도 있습니다. – nwellnhof