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

📄 c14n.c.svn-base

📁 这是一个用于解析xml文件的类库。使用这个类库
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
        }        xmlOutputBufferWriteString(ctx->buf, (const char *) cur->name);        xmlOutputBufferWriteString(ctx->buf, ">");        if (parent_is_doc) {	    /* restore this flag from the stack for next node */            ctx->parent_is_doc = parent_is_doc;	    ctx->pos = XMLC14N_AFTER_DOCUMENT_ELEMENT;        }    }    /*      * Restore ns_rendered stack position     */    xmlC14NVisibleNsStackRestore(ctx->ns_rendered, &state);    return (0);}/** * xmlC14NProcessNode: * @ctx: 		the pointer to C14N context object * @cur:		the node to process *  		 * Processes the given node * * Returns non-negative value on success or negative value on fail */static intxmlC14NProcessNode(xmlC14NCtxPtr ctx, xmlNodePtr cur){    int ret = 0;    int visible;    if ((ctx == NULL) || (cur == NULL)) {#ifdef DEBUG_C14N        xmlGenericError(xmlGenericErrorContext,                        "xmlC14NProcessNode: Null context or node pointer.\n");#endif        return (-1);    }    visible = xmlC14NIsVisible(ctx, cur, cur->parent);    switch (cur->type) {        case XML_ELEMENT_NODE:            ret = xmlC14NProcessElementNode(ctx, cur, visible);            break;        case XML_CDATA_SECTION_NODE:        case XML_TEXT_NODE:            /*             * Text Nodes             * the string value, except all ampersands are replaced              * by &amp;, all open angle brackets (<) are replaced by &lt;, all closing              * angle brackets (>) are replaced by &gt;, and all #xD characters are              * replaced by &#xD;.             */            /* cdata sections are processed as text nodes */            /* todo: verify that cdata sections are included in XPath nodes set */            if ((visible) && (cur->content != NULL)) {                xmlChar *buffer;                buffer = xmlC11NNormalizeText(cur->content);                if (buffer != NULL) {                    xmlOutputBufferWriteString(ctx->buf,                                               (const char *) buffer);                    xmlFree(buffer);                } else {#ifdef DEBUG_C14N                    xmlGenericError(xmlGenericErrorContext,                                    "xmlC14NProcessNode: xmlC11NNormalizeText() failed\n");#endif                    return (-1);                }            }            break;        case XML_PI_NODE:            /*              * Processing Instruction (PI) Nodes-              * The opening PI symbol (<?), the PI target name of the node,              * a leading space and the string value if it is not empty, and              * the closing PI symbol (?>). If the string value is empty,              * then the leading space is not added. Also, a trailing #xA is              * rendered after the closing PI symbol for PI children of the              * root node with a lesser document order than the document              * element, and a leading #xA is rendered before the opening PI              * symbol of PI children of the root node with a greater document              * order than the document element.             */            if (visible) {                if (ctx->pos == XMLC14N_AFTER_DOCUMENT_ELEMENT) {                    xmlOutputBufferWriteString(ctx->buf, "\x0A<?");                } else {                    xmlOutputBufferWriteString(ctx->buf, "<?");                }                xmlOutputBufferWriteString(ctx->buf,                                           (const char *) cur->name);                if ((cur->content != NULL) && (*(cur->content) != '\0')) {                    xmlChar *buffer;                    xmlOutputBufferWriteString(ctx->buf, " ");                    /* todo: do we need to normalize pi? */                    buffer = xmlC11NNormalizePI(cur->content);                    if (buffer != NULL) {                        xmlOutputBufferWriteString(ctx->buf,                                                   (const char *) buffer);                        xmlFree(buffer);                    } else {#ifdef DEBUG_C14N                        xmlGenericError(xmlGenericErrorContext,                                        "xmlC14NProcessNode: xmlC11NNormalizePI() failed\n");#endif                        return (-1);                    }                }                if (ctx->pos == XMLC14N_BEFORE_DOCUMENT_ELEMENT) {                    xmlOutputBufferWriteString(ctx->buf, "?>\x0A");                } else {                    xmlOutputBufferWriteString(ctx->buf, "?>");                }            }            break;        case XML_COMMENT_NODE:            /*             * Comment Nodes             * Nothing if generating canonical XML without  comments. For              * canonical XML with comments, generate the opening comment              * symbol (<!--), the string value of the node, and the              * closing comment symbol (-->). Also, a trailing #xA is rendered              * after the closing comment symbol for comment children of the              * root node with a lesser document order than the document              * element, and a leading #xA is rendered before the opening              * comment symbol of comment children of the root node with a              * greater document order than the document element. (Comment              * children of the root node represent comments outside of the              * top-level document element and outside of the document type              * declaration).             */            if (visible && ctx->with_comments) {                if (ctx->pos == XMLC14N_AFTER_DOCUMENT_ELEMENT) {                    xmlOutputBufferWriteString(ctx->buf, "\x0A<!--");                } else {                    xmlOutputBufferWriteString(ctx->buf, "<!--");                }                if (cur->content != NULL) {                    xmlChar *buffer;                    /* todo: do we need to normalize comment? */                    buffer = xmlC11NNormalizeComment(cur->content);                    if (buffer != NULL) {                        xmlOutputBufferWriteString(ctx->buf,                                                   (const char *) buffer);                        xmlFree(buffer);                    } else {#ifdef DEBUG_C14N                        xmlGenericError(xmlGenericErrorContext,                                        "xmlC14NProcessNode: xmlC11NNormalizeComment() failed\n");#endif                        return (-1);                    }                }                if (ctx->pos == XMLC14N_BEFORE_DOCUMENT_ELEMENT) {                    xmlOutputBufferWriteString(ctx->buf, "-->\x0A");                } else {                    xmlOutputBufferWriteString(ctx->buf, "-->");                }            }            break;        case XML_DOCUMENT_NODE:        case XML_DOCUMENT_FRAG_NODE:   /* should be processed as document? */#ifdef LIBXML_DOCB_ENABLED        case XML_DOCB_DOCUMENT_NODE:   /* should be processed as document? */#endif#ifdef LIBXML_HTML_ENABLED        case XML_HTML_DOCUMENT_NODE:   /* should be processed as document? */#endif            if (cur->children != NULL) {                ctx->pos = XMLC14N_BEFORE_DOCUMENT_ELEMENT;                ctx->parent_is_doc = 1;                ret = xmlC14NProcessNodeList(ctx, cur->children);            }            break;        case XML_ATTRIBUTE_NODE:	    xmlC14NErr(ctx, cur, XML_C14N_INVALID_NODE,		"xmlC14NProcessNode: XML_ATTRIBUTE_NODE is illegal here\n");            return (-1);        case XML_NAMESPACE_DECL:	    xmlC14NErr(ctx, cur, XML_C14N_INVALID_NODE,		"xmlC14NProcessNode: XML_NAMESPACE_DECL is illegal here\n");            return (-1);        case XML_ENTITY_REF_NODE:	    xmlC14NErr(ctx, cur, XML_C14N_INVALID_NODE,		"xmlC14NProcessNode: XML_ENTITY_REF_NODE is illegal here\n");            return (-1);        case XML_ENTITY_NODE:	    xmlC14NErr(ctx, cur, XML_C14N_INVALID_NODE,		"xmlC14NProcessNode: XML_ENTITY_NODE is illegal here\n");            return (-1);        case XML_DOCUMENT_TYPE_NODE:        case XML_NOTATION_NODE:        case XML_DTD_NODE:        case XML_ELEMENT_DECL:        case XML_ATTRIBUTE_DECL:        case XML_ENTITY_DECL:#ifdef LIBXML_XINCLUDE_ENABLED        case XML_XINCLUDE_START:        case XML_XINCLUDE_END:#endif            /*              * should be ignored according to "W3C Canonical XML"              */            break;        default:#ifdef DEBUG_C14N            xmlGenericError(xmlGenericErrorContext,                            "xmlC14NProcessNode: unknown node type = %d\n",                            cur->type);#endif            return (-1);    }    return (ret);}/** * xmlC14NProcessNodeList: * @ctx: 		the pointer to C14N context object * @cur:		the node to start from *  		 * Processes all nodes in the row starting from cur. * * Returns non-negative value on success or negative value on fail */static intxmlC14NProcessNodeList(xmlC14NCtxPtr ctx, xmlNodePtr cur){    int ret;    if (ctx == NULL) {#ifdef DEBUG_C14N        xmlGenericError(xmlGenericErrorContext,                        "xmlC14NProcessNodeList: Null context pointer.\n");#endif        return (-1);    }    for (ret = 0; cur != NULL && ret >= 0; cur = cur->next) {        ret = xmlC14NProcessNode(ctx, cur);    }    return (ret);}/** * xmlC14NFreeCtx: * @ctx: the pointer to C14N context object * 		 * Cleanups the C14N context object. */static voidxmlC14NFreeCtx(xmlC14NCtxPtr ctx){    if (ctx == NULL) {#ifdef DEBUG_C14N        xmlGenericError(xmlGenericErrorContext,                        "xmlC14NFreeCtx: ctx == NULL\n");#endif        return;    }    if (ctx->ns_rendered != NULL) {        xmlC14NVisibleNsStackDestroy(ctx->ns_rendered);    }    xmlFree(ctx);}/** * xmlC14NNewCtx: * @doc: 		the XML document for canonization * @is_visible_callback:the function to use to determine is node visible  *			or not * @user_data: 		the first parameter for @is_visible_callback function *			(in most cases, it is nodes set) * @inclusive_ns_prefixe the list of inclusive namespace prefixes  *			ended with a NULL or NULL if there is no *			inclusive namespaces (only for exclusive  *			canonicalization) * @with_comments: 	include comments in the result (!=0) or not (==0) * @buf: 		the output buffer to store canonical XML; this  *			buffer MUST have encoder==NULL because C14N requires *			UTF-8 output *  		 * Creates new C14N context object to store C14N parameters. * * Returns pointer to newly created object (success) or NULL (fail) */static xmlC14NCtxPtrxmlC14NNewCtx(xmlDocPtr doc,  	      xmlC14NIsVisibleCallback is_visible_callback, void* user_data,              int exclusive, xmlChar ** inclusive_ns_prefixes,              int with_comments, xmlOutputBufferPtr buf){    xmlC14NCtxPtr ctx = NULL;    if ((doc == NULL) || (buf == NULL)) {#ifdef DEBUG_C14N        xmlGenericError(xmlGenericErrorContext,                        "xmlC14NNewCtx: pointer to document or output buffer is NULL\n");#endif        return (NULL);    }    /*     *  Validate the encoding output buffer encoding     */    if (buf->encoder != NULL) {        xmlC14NErr(ctx, (xmlNodePtr) doc, XML_C14N_REQUIRES_UTF8,"xmlC14NNewCtx: output buffer encoder != NULL but C14N requires UTF8 output\n");        return (NULL);    }    /*     *  Validate the XML document encoding value, if provided.     */    if (doc->charset != XML_CHAR_ENCODING_UTF8) {        xmlC14NErr(ctx, (xmlNodePtr) doc, XML_C14N_REQUIRES_UTF8,		   "xmlC14NNewCtx: source document not in UTF8\n");        return (NULL);    }    /*     * Allocate a new xmlC14NCtxPtr and fill the fields.     */    ctx = (xmlC14NCtxPtr) xmlMalloc(sizeof(xmlC14NCtx));    if (ctx == NULL) {	xmlC14NErrMemory("creating context");        return (NULL);    }    memset(ctx, 0, sizeof(xmlC14NCtx));    /*     * initialize C14N context     */    ctx->doc = doc;    ctx->with_comments = with_comments;    ctx->is_visible_callback = is_visible_callback;    ctx->user_data = user_data;    ctx->buf = buf;    ctx->parent_is_doc = 1;    ctx->pos = XMLC14N_BEFORE_DOCUMENT_ELEMENT;    ctx->ns_rendered = xmlC14NVisibleNsStackCreate();    if(ctx->ns_rendered == NULL) {        xmlC14NErr(ctx, (xmlNodePtr) doc, XML_C14N_CREATE_STACK,		   "xmlC14NNewCtx: xmlC14NVisibleNsStackCreate failed\n");	xmlC14NFreeCtx(ctx);        return (NULL);    }    /*     * Set "exclusive" flag, create a nodes set for namespaces     * stack and remember list of incluseve prefixes     */    if (exclusive) {        ctx->exclusive = 1;        ctx->inclusive_ns_prefixes = inclusive_ns_prefixes;    }    return (ctx);}/** * xmlC14NExecute: * @doc: 		the XML document for canonization * @is_visible_callback:the function to use to determine is node visible  *			or not * @user_data: 		the first parameter for @is_visible_callback function *			(in most cases, it is nodes set) * @exclusive:		the exclusive flag (0 - non-exclusive canonicalization; *			otherwise - exclusive canonicalization) * @inclusive_ns_prefixes: the list of inclusive namespace prefixes  *			ended with a NULL or NULL if there is no *			inclusive namespaces (only for exclusive  *			canonicalization, ignored otherwise) * @with_comments: 	include comments in the result (!=0) or not (==0) * @buf: 		the output buffer to store canonical XML; this  *			buffer MUST have encoder==NULL because C14N requires *			UTF-8 output *  		 * Dumps the canonized image of given XML document into the provided buffer. * For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or * "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) *

⌨️ 快捷键说明

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