⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htmltree.c

📁 xml开源解析代码.版本为libxml2-2.6.29,可支持GB3212.网络消息发送XML时很有用.
💻 C
📖 第 1 页 / 共 3 页
字号:
    memset(outbuf, 0, (size_t) sizeof(xmlOutputBuffer));    outbuf->buffer = buf;    outbuf->encoder = NULL;    outbuf->writecallback = NULL;    outbuf->closecallback = NULL;    outbuf->context = NULL;    outbuf->written = 0;    use = buf->use;    htmlNodeDumpFormatOutput(outbuf, doc, cur, NULL, format);    xmlFree(outbuf);    ret = buf->use - use;    return (ret);}/** * htmlNodeDump: * @buf:  the HTML buffer output * @doc:  the document * @cur:  the current node * * Dump an HTML node, recursive behaviour,children are printed too, * and formatting returns are added. * * Returns the number of byte written or -1 in case of error */inthtmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur) {    xmlInitParser();    return(htmlNodeDumpFormat(buf, doc, cur, 1));}/** * htmlNodeDumpFileFormat: * @out:  the FILE pointer * @doc:  the document * @cur:  the current node * @encoding: the document encoding * @format:  should formatting spaces been added * * Dump an HTML node, recursive behaviour,children are printed too. * * TODO: if encoding == NULL try to save in the doc encoding * * returns: the number of byte written or -1 in case of failure. */inthtmlNodeDumpFileFormat(FILE *out, xmlDocPtr doc,	               xmlNodePtr cur, const char *encoding, int format) {    xmlOutputBufferPtr buf;    xmlCharEncodingHandlerPtr handler = NULL;    int ret;    xmlInitParser();    if (encoding != NULL) {	xmlCharEncoding enc;	enc = xmlParseCharEncoding(encoding);	if (enc != XML_CHAR_ENCODING_UTF8) {	    handler = xmlFindCharEncodingHandler(encoding);	    if (handler == NULL)		return(-1);	}    }    /*     * Fallback to HTML or ASCII when the encoding is unspecified     */    if (handler == NULL)	handler = xmlFindCharEncodingHandler("HTML");    if (handler == NULL)	handler = xmlFindCharEncodingHandler("ascii");    /*      * save the content to a temp buffer.     */    buf = xmlOutputBufferCreateFile(out, handler);    if (buf == NULL) return(0);    htmlNodeDumpFormatOutput(buf, doc, cur, encoding, format);    ret = xmlOutputBufferClose(buf);    return(ret);}/** * htmlNodeDumpFile: * @out:  the FILE pointer * @doc:  the document * @cur:  the current node * * Dump an HTML node, recursive behaviour,children are printed too, * and formatting returns are added. */voidhtmlNodeDumpFile(FILE *out, xmlDocPtr doc, xmlNodePtr cur) {    htmlNodeDumpFileFormat(out, doc, cur, NULL, 1);}/** * htmlDocDumpMemoryFormat: * @cur:  the document * @mem:  OUT: the memory pointer * @size:  OUT: the memory length * @format:  should formatting spaces been added * * Dump an HTML document in memory and return the xmlChar * and it's size. * It's up to the caller to free the memory. */voidhtmlDocDumpMemoryFormat(xmlDocPtr cur, xmlChar**mem, int *size, int format) {    xmlOutputBufferPtr buf;    xmlCharEncodingHandlerPtr handler = NULL;    const char *encoding;    xmlInitParser();    if ((mem == NULL) || (size == NULL))        return;    if (cur == NULL) {	*mem = NULL;	*size = 0;	return;    }    encoding = (const char *) htmlGetMetaEncoding(cur);    if (encoding != NULL) {	xmlCharEncoding enc;	enc = xmlParseCharEncoding(encoding);	if (enc != cur->charset) {	    if (cur->charset != XML_CHAR_ENCODING_UTF8) {		/*		 * Not supported yet		 */		*mem = NULL;		*size = 0;		return;	    }	    handler = xmlFindCharEncodingHandler(encoding);	    if (handler == NULL) {		*mem = NULL;		*size = 0;		return;	    }	} else {	    handler = xmlFindCharEncodingHandler(encoding);	}    }    /*     * Fallback to HTML or ASCII when the encoding is unspecified     */    if (handler == NULL)	handler = xmlFindCharEncodingHandler("HTML");    if (handler == NULL)	handler = xmlFindCharEncodingHandler("ascii");    buf = xmlAllocOutputBuffer(handler);    if (buf == NULL) {	*mem = NULL;	*size = 0;	return;    }	htmlDocContentDumpFormatOutput(buf, cur, NULL, format);    xmlOutputBufferFlush(buf);    if (buf->conv != NULL) {	*size = buf->conv->use;	*mem = xmlStrndup(buf->conv->content, *size);    } else {	*size = buf->buffer->use;	*mem = xmlStrndup(buf->buffer->content, *size);    }    (void)xmlOutputBufferClose(buf);}/** * htmlDocDumpMemory: * @cur:  the document * @mem:  OUT: the memory pointer * @size:  OUT: the memory length * * Dump an HTML document in memory and return the xmlChar * and it's size. * It's up to the caller to free the memory. */voidhtmlDocDumpMemory(xmlDocPtr cur, xmlChar**mem, int *size) {	htmlDocDumpMemoryFormat(cur, mem, size, 1);}/************************************************************************ *									* *   		Dumping HTML tree content to an I/O output buffer	* *									* ************************************************************************/void xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur);/** * htmlDtdDumpOutput: * @buf:  the HTML buffer output * @doc:  the document * @encoding:  the encoding string *  * TODO: check whether encoding is needed * * Dump the HTML document DTD, if any. */static voidhtmlDtdDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc,	          const char *encoding ATTRIBUTE_UNUSED) {    xmlDtdPtr cur = doc->intSubset;    if (cur == NULL) {	htmlSaveErr(XML_SAVE_NO_DOCTYPE, (xmlNodePtr) doc, NULL);	return;    }    xmlOutputBufferWriteString(buf, "<!DOCTYPE ");    xmlOutputBufferWriteString(buf, (const char *)cur->name);    if (cur->ExternalID != NULL) {	xmlOutputBufferWriteString(buf, " PUBLIC ");	xmlBufferWriteQuotedString(buf->buffer, cur->ExternalID);	if (cur->SystemID != NULL) {	    xmlOutputBufferWriteString(buf, " ");	    xmlBufferWriteQuotedString(buf->buffer, cur->SystemID);	}     }  else if (cur->SystemID != NULL) {	xmlOutputBufferWriteString(buf, " SYSTEM ");	xmlBufferWriteQuotedString(buf->buffer, cur->SystemID);    }    xmlOutputBufferWriteString(buf, ">\n");}/** * htmlAttrDumpOutput: * @buf:  the HTML buffer output * @doc:  the document * @cur:  the attribute pointer * @encoding:  the encoding string * * Dump an HTML attribute */static voidhtmlAttrDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur,	           const char *encoding ATTRIBUTE_UNUSED) {    xmlChar *value;    /*     * TODO: The html output method should not escape a & character     *       occurring in an attribute value immediately followed by     *       a { character (see Section B.7.1 of the HTML 4.0 Recommendation).     */    if (cur == NULL) {	return;    }    xmlOutputBufferWriteString(buf, " ");    if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {        xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);	xmlOutputBufferWriteString(buf, ":");    }    xmlOutputBufferWriteString(buf, (const char *)cur->name);    if ((cur->children != NULL) && (!htmlIsBooleanAttr(cur->name))) {	value = xmlNodeListGetString(doc, cur->children, 0);	if (value) {	    xmlOutputBufferWriteString(buf, "=");	    if ((cur->ns == NULL) && (cur->parent != NULL) &&		(cur->parent->ns == NULL) &&		((!xmlStrcasecmp(cur->name, BAD_CAST "href")) ||	         (!xmlStrcasecmp(cur->name, BAD_CAST "action")) ||		 (!xmlStrcasecmp(cur->name, BAD_CAST "src")) ||		 ((!xmlStrcasecmp(cur->name, BAD_CAST "name")) &&		  (!xmlStrcasecmp(cur->parent->name, BAD_CAST "a"))))) {		xmlChar *escaped;		xmlChar *tmp = value;		while (IS_BLANK_CH(*tmp)) tmp++;		escaped = xmlURIEscapeStr(tmp, BAD_CAST"@/:=?;#%&,+");		if (escaped != NULL) {		    xmlBufferWriteQuotedString(buf->buffer, escaped);		    xmlFree(escaped);		} else {		    xmlBufferWriteQuotedString(buf->buffer, value);		}	    } else {		xmlBufferWriteQuotedString(buf->buffer, value);	    }	    xmlFree(value);	} else  {	    xmlOutputBufferWriteString(buf, "=\"\"");	}    }}/** * htmlAttrListDumpOutput: * @buf:  the HTML buffer output * @doc:  the document * @cur:  the first attribute pointer * @encoding:  the encoding string * * Dump a list of HTML attributes */static voidhtmlAttrListDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur, const char *encoding) {    if (cur == NULL) {	return;    }    while (cur != NULL) {        htmlAttrDumpOutput(buf, doc, cur, encoding);	cur = cur->next;    }}/** * htmlNodeListDumpOutput: * @buf:  the HTML buffer output * @doc:  the document * @cur:  the first node * @encoding:  the encoding string * @format:  should formatting spaces been added * * Dump an HTML node list, recursive behaviour,children are printed too. */static voidhtmlNodeListDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc,	               xmlNodePtr cur, const char *encoding, int format) {    if (cur == NULL) {	return;    }    while (cur != NULL) {        htmlNodeDumpFormatOutput(buf, doc, cur, encoding, format);	cur = cur->next;    }}/** * htmlNodeDumpFormatOutput: * @buf:  the HTML buffer output * @doc:  the document * @cur:  the current node * @encoding:  the encoding string * @format:  should formatting spaces been added * * Dump an HTML node, recursive behaviour,children are printed too. */voidhtmlNodeDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr doc,	                 xmlNodePtr cur, const char *encoding, int format) {    const htmlElemDesc * info;    xmlInitParser();    if ((cur == NULL) || (buf == NULL)) {	return;    }    /*     * Special cases.     */    if (cur->type == XML_DTD_NODE)	return;    if ((cur->type == XML_HTML_DOCUMENT_NODE) ||        (cur->type == XML_DOCUMENT_NODE)){	htmlDocContentDumpOutput(buf, (xmlDocPtr) cur, encoding);	return;    }    if (cur->type == XML_ATTRIBUTE_NODE) {        htmlAttrDumpOutput(buf, doc, (xmlAttrPtr) cur, encoding);	return;    }    if (cur->type == HTML_TEXT_NODE) {	if (cur->content != NULL) {	    if (((cur->name == (const xmlChar *)xmlStringText) ||		 (cur->name != (const xmlChar *)xmlStringTextNoenc)) &&		((cur->parent == NULL) ||		 ((xmlStrcasecmp(cur->parent->name, BAD_CAST "script")) &&		  (xmlStrcasecmp(cur->parent->name, BAD_CAST "style"))))) {		xmlChar *buffer;		buffer = xmlEncodeEntitiesReentrant(doc, cur->content);		if (buffer != NULL) {		    xmlOutputBufferWriteString(buf, (const char *)buffer);		    xmlFree(buffer);		}	    } else {		xmlOutputBufferWriteString(buf, (const char *)cur->content);	    }	}	return;    }    if (cur->type == HTML_COMMENT_NODE) {	if (cur->content != NULL) {	    xmlOutputBufferWriteString(buf, "<!--");	    xmlOutputBufferWriteString(buf, (const char *)cur->content);	    xmlOutputBufferWriteString(buf, "-->");	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -