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

📄 xmlsave.c

📁 xml开源解析代码.版本为libxml2-2.6.29,可支持GB3212.网络消息发送XML时很有用.
💻 C
📖 第 1 页 / 共 5 页
字号:
		    xmlOutputBufferWriteString(buf, (const char *) child->content);		    /* (We cannot use xhtmlNodeDumpOutput() here because		     * we wish to leave '>' unescaped!) */		    ctxt->level = level;		    ctxt->format = indent;		} else {		    /* We must use a CDATA section.  Unfortunately,		     * this will break CSS and JavaScript when read by		     * a browser in HTML4-compliant mode. :-( */		    start = end = child->content;		    while (*end != '\0') {			if (*end == ']' &&			    *(end + 1) == ']' &&			    *(end + 2) == '>') {			    end = end + 2;			    xmlOutputBufferWrite(buf, 9, "<![CDATA[");			    xmlOutputBufferWrite(buf, end - start,						 (const char *)start);			    xmlOutputBufferWrite(buf, 3, "]]>");			    start = end;			}			end++;		    }		    if (start != end) {			xmlOutputBufferWrite(buf, 9, "<![CDATA[");			xmlOutputBufferWrite(buf, end - start,			                     (const char *)start);			xmlOutputBufferWrite(buf, 3, "]]>");		    }		}	    } else {		int level = ctxt->level;		int indent = ctxt->format;		ctxt->level = 0;		ctxt->format = 0;		xhtmlNodeDumpOutput(ctxt, child);		ctxt->level = level;		ctxt->format = indent;	    }	    child = child->next;	}    }#endif    if (cur->children != NULL) {	int indent = ctxt->format;		if (format) xmlOutputBufferWrite(buf, 1, "\n");	if (ctxt->level >= 0) ctxt->level++;	ctxt->format = format;	xhtmlNodeListDumpOutput(ctxt, cur->children);	if (ctxt->level > 0) ctxt->level--;	ctxt->format = indent;	if ((xmlIndentTreeOutput) && (format))	    xmlOutputBufferWrite(buf, ctxt->indent_size *	                         (ctxt->level > ctxt->indent_nr ? 				  ctxt->indent_nr : ctxt->level),				 ctxt->indent);    }    xmlOutputBufferWrite(buf, 2, "</");    if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {        xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);	xmlOutputBufferWrite(buf, 1, ":");    }    xmlOutputBufferWriteString(buf, (const char *)cur->name);    xmlOutputBufferWrite(buf, 1, ">");}#endif/************************************************************************ *									* *			Public entry points				* *									* ************************************************************************//** * xmlSaveToFd: * @fd:  a file descriptor number * @encoding:  the encoding name to use or NULL * @options:  a set of xmlSaveOptions * * Create a document saving context serializing to a file descriptor * with the encoding and the options given. * * Returns a new serialization context or NULL in case of error. */xmlSaveCtxtPtrxmlSaveToFd(int fd, const char *encoding, int options){    xmlSaveCtxtPtr ret;    ret = xmlNewSaveCtxt(encoding, options);    if (ret == NULL) return(NULL);    ret->buf = xmlOutputBufferCreateFd(fd, ret->handler);    if (ret->buf == NULL) {	xmlFreeSaveCtxt(ret);	return(NULL);    }    return(ret);}/** * xmlSaveToFilename: * @filename:  a file name or an URL * @encoding:  the encoding name to use or NULL * @options:  a set of xmlSaveOptions * * Create a document saving context serializing to a filename or possibly * to an URL (but this is less reliable) with the encoding and the options * given. * * Returns a new serialization context or NULL in case of error. */xmlSaveCtxtPtrxmlSaveToFilename(const char *filename, const char *encoding, int options){    xmlSaveCtxtPtr ret;    int compression = 0; /* TODO handle compression option */    ret = xmlNewSaveCtxt(encoding, options);    if (ret == NULL) return(NULL);    ret->buf = xmlOutputBufferCreateFilename(filename, ret->handler,                                             compression);    if (ret->buf == NULL) {	xmlFreeSaveCtxt(ret);	return(NULL);    }    return(ret);}/** * xmlSaveToBuffer: * @buffer:  a buffer * @encoding:  the encoding name to use or NULL * @options:  a set of xmlSaveOptions * * Create a document saving context serializing to a buffer * with the encoding and the options given * * Returns a new serialization context or NULL in case of error. */xmlSaveCtxtPtrxmlSaveToBuffer(xmlBufferPtr buffer, const char *encoding, int options){    xmlSaveCtxtPtr ret;    xmlOutputBufferPtr out_buff;    xmlCharEncodingHandlerPtr handler;    ret = xmlNewSaveCtxt(encoding, options);    if (ret == NULL) return(NULL);    if (encoding != NULL) {        handler = xmlFindCharEncodingHandler(encoding);        if (handler == NULL) {            xmlFree(ret);            return(NULL);        }    } else        handler = NULL;    out_buff = xmlOutputBufferCreateBuffer(buffer, handler);    if (out_buff == NULL) {        xmlFree(ret);        if (handler) xmlCharEncCloseFunc(handler);        return(NULL);    }    ret->buf = out_buff;    return(ret);}/** * xmlSaveToIO: * @iowrite:  an I/O write function * @ioclose:  an I/O close function * @ioctx:  an I/O handler * @encoding:  the encoding name to use or NULL * @options:  a set of xmlSaveOptions * * Create a document saving context serializing to a file descriptor * with the encoding and the options given * * Returns a new serialization context or NULL in case of error. */xmlSaveCtxtPtrxmlSaveToIO(xmlOutputWriteCallback iowrite,            xmlOutputCloseCallback ioclose,            void *ioctx, const char *encoding, int options){    xmlSaveCtxtPtr ret;    ret = xmlNewSaveCtxt(encoding, options);    if (ret == NULL) return(NULL);    ret->buf = xmlOutputBufferCreateIO(iowrite, ioclose, ioctx, ret->handler);    if (ret->buf == NULL) {	xmlFreeSaveCtxt(ret);	return(NULL);    }    return(ret);}/** * xmlSaveDoc: * @ctxt:  a document saving context * @doc:  a document * * Save a full document to a saving context * TODO: The function is not fully implemented yet as it does not return the * byte count but 0 instead * * Returns the number of byte written or -1 in case of error */longxmlSaveDoc(xmlSaveCtxtPtr ctxt, xmlDocPtr doc){    long ret = 0;    if ((ctxt == NULL) || (doc == NULL)) return(-1);    if (xmlDocContentDumpOutput(ctxt, doc) < 0)        return(-1);    return(ret);}/** * xmlSaveTree: * @ctxt:  a document saving context * @node:  the top node of the subtree to save * * Save a subtree starting at the node parameter to a saving context * TODO: The function is not fully implemented yet as it does not return the * byte count but 0 instead * * Returns the number of byte written or -1 in case of error */longxmlSaveTree(xmlSaveCtxtPtr ctxt, xmlNodePtr node){    long ret = 0;    if ((ctxt == NULL) || (node == NULL)) return(-1);    xmlNodeDumpOutputInternal(ctxt, node);    return(ret);}/** * xmlSaveFlush: * @ctxt:  a document saving context * * Flush a document saving context, i.e. make sure that all bytes have * been output. * * Returns the number of byte written or -1 in case of error. */intxmlSaveFlush(xmlSaveCtxtPtr ctxt){    if (ctxt == NULL) return(-1);    if (ctxt->buf == NULL) return(-1);    return(xmlOutputBufferFlush(ctxt->buf));}/** * xmlSaveClose: * @ctxt:  a document saving context * * Close a document saving context, i.e. make sure that all bytes have * been output and free the associated data. * * Returns the number of byte written or -1 in case of error. */intxmlSaveClose(xmlSaveCtxtPtr ctxt){    int ret;    if (ctxt == NULL) return(-1);    ret = xmlSaveFlush(ctxt);    xmlFreeSaveCtxt(ctxt);    return(ret);}/** * xmlSaveSetEscape: * @ctxt:  a document saving context * @escape:  the escaping function * * Set a custom escaping function to be used for text in element content * * Returns 0 if successful or -1 in case of error. */intxmlSaveSetEscape(xmlSaveCtxtPtr ctxt, xmlCharEncodingOutputFunc escape){    if (ctxt == NULL) return(-1);    ctxt->escape = escape;    return(0);}/** * xmlSaveSetAttrEscape: * @ctxt:  a document saving context * @escape:  the escaping function * * Set a custom escaping function to be used for text in attribute content * * Returns 0 if successful or -1 in case of error. */intxmlSaveSetAttrEscape(xmlSaveCtxtPtr ctxt, xmlCharEncodingOutputFunc escape){    if (ctxt == NULL) return(-1);    ctxt->escapeAttr = escape;    return(0);}/************************************************************************ *									* *		Public entry points based on buffers			* *									* ************************************************************************//** * xmlAttrSerializeTxtContent: * @buf:  the XML buffer output * @doc:  the document * @attr: the attribute node * @string: the text content * * Serialize text attribute values to an xml simple buffer */voidxmlAttrSerializeTxtContent(xmlBufferPtr buf, xmlDocPtr doc,                           xmlAttrPtr attr, const xmlChar * string){    xmlChar *base, *cur;    if (string == NULL)        return;    base = cur = (xmlChar *) string;    while (*cur != 0) {        if (*cur == '\n') {            if (base != cur)                xmlBufferAdd(buf, base, cur - base);            xmlBufferAdd(buf, BAD_CAST "&#10;", 5);            cur++;            base = cur;        } else if (*cur == '\r') {            if (base != cur)                xmlBufferAdd(buf, base, cur - base);            xmlBufferAdd(buf, BAD_CAST "&#13;", 5);            cur++;            base = cur;        } else if (*cur == '\t') {            if (base != cur)                xmlBufferAdd(buf, base, cur - base);            xmlBufferAdd(buf, BAD_CAST "&#9;", 4);            cur++;            base = cur;        } else if (*cur == '"') {            if (base != cur)                xmlBufferAdd(buf, base, cur - base);            xmlBufferAdd(buf, BAD_CAST "&quot;", 6);            cur++;            base = cur;        } else if (*cur == '<') {            if (base != cur)                xmlBufferAdd(buf, base, cur - base);            xmlBufferAdd(buf, BAD_CAST "&lt;", 4);            cur++;            base = cur;        } else if (*cur == '>') {            if (base != cur)                xmlBufferAdd(buf, base, cur - base);            xmlBufferAdd(buf, BAD_CAST "&gt;", 4);            cur++;            base = cur;        } else if (*cur == '&') {            if (base != cur)                xmlBufferAdd(buf, base, cur - base);            xmlBufferAdd(buf, BAD_CAST "&amp;", 5);            cur++;            base = cur;        } else if ((*cur >= 0x80) && ((doc == NULL) ||                                      (doc->encoding == NULL))) {            /*             * We assume we have UTF-8 content.             */            unsigned char tmp[10];            int val = 0, l = 1;            if (base != cur)                xmlBufferAdd(buf, base, cur - base);            if (*cur < 0xC0) {                xmlSaveErr(XML_SAVE_NOT_UTF8, (xmlNodePtr) attr, NULL);                if (doc != NULL)                    doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");		xmlSerializeHexCharRef(tmp, *cur);                xmlBufferAdd(buf, (xmlChar *) tmp, -1);                cur++;                base = cur;                continue;            } else if (*cur < 0xE0) {                val = (cur[0]) & 0x1F;                val <<= 6;                val |= (cur[1]) & 0x3F;                l = 2;            } else if (*cur < 0xF0) {                val = (cur[0]) & 0x0F;                val <<= 6;                val |= (cur[1]) & 0x3F;                val <<= 6;                val |= (cur[2]) & 0x3F;                l = 3;            } else if (*cur < 0xF8) {                val = (cur[0]) & 0x07;                val <<= 6;                val |= (cur[1]) & 0x3F;                val <<= 6;                val |= (cur[2]) & 0x3F;                val <<= 6;                val |= (cur[3]) & 0x3F;                l = 4;            }            if ((l == 1) || (!IS_CHAR(val))) {                xmlSaveErr(XML_SAVE_CHAR_INVALID, (xmlNodePtr) attr, NULL);                if (doc != NULL)                    doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");				xmlSerializeHexCharRef(tmp, *cur);                xmlBufferAdd(buf, (xmlChar *) tmp, -1);                cur++;                base = cur;                continue;            }            /*             * We could do multiple things here. Just save             * as a char ref             */	    xmlSerializeHexCharRef(tmp, val);            xmlBufferAdd(buf, (xmlChar *) tmp, -1);            cur += l;            base = cur;        } else {            cur++;        }    }    if (base != cur)        xmlBufferAdd(buf, base, cur - base);}/** * xmlNodeDump: * @buf:  the XML buffer output * @doc:  the document * @cur:  the current node * @level: the imbrication level for indenting * @format: is formatting allowed * * Dump an XML node, recursive behaviour,children are printed too. * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 * or xmlKeepBlanksDefault(0) was called * * Returns the number of bytes written to the buffer or -1 in case of error */intxmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level,            int format){

⌨️ 快捷键说明

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