diff --git a/HTMLparser.c b/HTMLparser.c index 9e275a2..3d4831c 100644 --- a/HTMLparser.c +++ b/HTMLparser.c @@ -1394,6 +1394,8 @@ static void htmlCheckImplied(htmlParserCtxtPtr ctxt, const xmlChar *newtag) { int i; + if (ctxt->options & HTML_PARSE_NOIMPLIED) + return; if (!htmlOmittedDefaultValue) return; if (xmlStrEqual(newtag, BAD_CAST"html")) diff --git a/include/libxml/HTMLparser.h b/include/libxml/HTMLparser.h index 05905e4..cde0ac6 100644 --- a/include/libxml/HTMLparser.h +++ b/include/libxml/HTMLparser.h @@ -182,6 +182,7 @@ typedef enum { HTML_PARSE_PEDANTIC = 1<<7, /* pedantic error reporting */ HTML_PARSE_NOBLANKS = 1<<8, /* remove blank nodes */ HTML_PARSE_NONET = 1<<11,/* Forbid network access */ + HTML_PARSE_NOIMPLIED= 1<<13,/* Do not add implied html/body... elements */ HTML_PARSE_COMPACT = 1<<16 /* compact small text nodes */ } htmlParserOption; diff --git a/parser.c b/parser.c index c779c1d..a63c668 100644 --- a/parser.c +++ b/parser.c @@ -12870,8 +12870,14 @@ xmlParseInNodeContext(xmlNodePtr node, const char *data, int datalen, if (doc->type == XML_DOCUMENT_NODE) ctxt = xmlCreateMemoryParserCtxt((char *) data, datalen); #ifdef LIBXML_HTML_ENABLED - else if (doc->type == XML_HTML_DOCUMENT_NODE) + else if (doc->type == XML_HTML_DOCUMENT_NODE) { ctxt = htmlCreateMemoryParserCtxt((char *) data, datalen); + /* + * When parsing in context, it makes no sense to add implied + * elements like html/body/etc... + */ + options |= HTML_PARSE_NOIMPLIED; + } #endif else return(XML_ERR_INTERNAL_ERROR);