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

📄 xmlwriter.c

📁 xml开源解析代码.版本为libxml2-2.6.29,可支持GB3212.网络消息发送XML时很有用.
💻 C
📖 第 1 页 / 共 5 页
字号:
					if (count < 0)						return -1;					sum += count;					/* fallthrough */                case XML_TEXTWRITER_NAME:                    /* Output namespace declarations */                    count = xmlTextWriterOutputNSDecl(writer);                    if (count < 0)                        return -1;                    sum += count;                    count = xmlOutputBufferWriteString(writer->out, ">");                    if (count < 0)                        return -1;                    sum += count;                    if (writer->indent)                        count =                            xmlOutputBufferWriteString(writer->out, "\n");                    p->state = XML_TEXTWRITER_TEXT;                    break;                default:                    break;            }        }    }    p = (xmlTextWriterStackEntry *)        xmlMalloc(sizeof(xmlTextWriterStackEntry));    if (p == 0) {        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,                        "xmlTextWriterStartElement : out of memory!\n");        return -1;    }    p->name = xmlStrdup(name);    if (p->name == 0) {        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,                        "xmlTextWriterStartElement : out of memory!\n");        xmlFree(p);        return -1;    }    p->state = XML_TEXTWRITER_NAME;    xmlListPushFront(writer->nodes, p);    if (writer->indent) {        count = xmlTextWriterWriteIndent(writer);        sum += count;    }    count = xmlOutputBufferWriteString(writer->out, "<");    if (count < 0)        return -1;    sum += count;    count =        xmlOutputBufferWriteString(writer->out, (const char *) p->name);    if (count < 0)        return -1;    sum += count;    return sum;}/** * xmlTextWriterStartElementNS: * @writer:  the xmlTextWriterPtr * @prefix:  namespace prefix or NULL * @name:  element local name * @namespaceURI:  namespace URI or NULL * * Start an xml element with namespace support. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterStartElementNS(xmlTextWriterPtr writer,                            const xmlChar * prefix, const xmlChar * name,                            const xmlChar * namespaceURI){    int count;    int sum;    xmlChar *buf;    if ((writer == NULL) || (name == NULL) || (*name == '\0'))        return -1;    buf = NULL;    if (prefix != 0) {        buf = xmlStrdup(prefix);        buf = xmlStrcat(buf, BAD_CAST ":");    }    buf = xmlStrcat(buf, name);    sum = 0;    count = xmlTextWriterStartElement(writer, buf);    xmlFree(buf);    if (count < 0)        return -1;    sum += count;    if (namespaceURI != 0) {        xmlTextWriterNsStackEntry *p = (xmlTextWriterNsStackEntry *)         xmlMalloc(sizeof(xmlTextWriterNsStackEntry));        if (p == 0) {            xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,                             "xmlTextWriterStartElementNS : out of memory!\n");            return -1;        }        buf = xmlStrdup(BAD_CAST "xmlns");        if (prefix != 0) {            buf = xmlStrcat(buf, BAD_CAST ":");            buf = xmlStrcat(buf, prefix);        }        p->prefix = buf;        p->uri = xmlStrdup(namespaceURI);        if (p->uri == 0) {            xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,                            "xmlTextWriterStartElementNS : out of memory!\n");            xmlFree(p);            return -1;        }        p->elem = xmlListFront(writer->nodes);        xmlListPushFront(writer->nsstack, p);    }    return sum;}/** * xmlTextWriterEndElement: * @writer:  the xmlTextWriterPtr * * End the current xml element. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterEndElement(xmlTextWriterPtr writer){    int count;    int sum;    xmlLinkPtr lk;    xmlTextWriterStackEntry *p;    if (writer == NULL)        return -1;    lk = xmlListFront(writer->nodes);    if (lk == 0) {        xmlListDelete(writer->nsstack);        writer->nsstack = NULL;        return -1;    }    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);    if (p == 0) {        xmlListDelete(writer->nsstack);        writer->nsstack = NULL;        return -1;    }    sum = 0;    switch (p->state) {        case XML_TEXTWRITER_ATTRIBUTE:            count = xmlTextWriterEndAttribute(writer);            if (count < 0) {                xmlListDelete(writer->nsstack);                writer->nsstack = NULL;                return -1;            }            sum += count;            /* fallthrough */        case XML_TEXTWRITER_NAME:            /* Output namespace declarations */            count = xmlTextWriterOutputNSDecl(writer);            if (count < 0)                return -1;            sum += count;            if (writer->indent) /* next element needs indent */                writer->doindent = 1;            count = xmlOutputBufferWriteString(writer->out, "/>");            if (count < 0)                return -1;            sum += count;            break;        case XML_TEXTWRITER_TEXT:            if ((writer->indent) && (writer->doindent)) {                count = xmlTextWriterWriteIndent(writer);                sum += count;                writer->doindent = 1;            } else                writer->doindent = 1;            count = xmlOutputBufferWriteString(writer->out, "</");            if (count < 0)                return -1;            sum += count;            count = xmlOutputBufferWriteString(writer->out,                                               (const char *) p->name);            if (count < 0)                return -1;            sum += count;            count = xmlOutputBufferWriteString(writer->out, ">");            if (count < 0)                return -1;            sum += count;            break;        default:            return -1;    }    if (writer->indent) {        count = xmlOutputBufferWriteString(writer->out, "\n");        sum += count;    }    xmlListPopFront(writer->nodes);    return sum;}/** * xmlTextWriterFullEndElement: * @writer:  the xmlTextWriterPtr * * End the current xml element. Writes an end tag even if the element is empty * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterFullEndElement(xmlTextWriterPtr writer){    int count;    int sum;    xmlLinkPtr lk;    xmlTextWriterStackEntry *p;    if (writer == NULL)        return -1;    lk = xmlListFront(writer->nodes);    if (lk == 0)        return -1;    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);    if (p == 0)        return -1;    sum = 0;    switch (p->state) {        case XML_TEXTWRITER_ATTRIBUTE:            count = xmlTextWriterEndAttribute(writer);            if (count < 0)                return -1;            sum += count;            /* fallthrough */        case XML_TEXTWRITER_NAME:            /* Output namespace declarations */            count = xmlTextWriterOutputNSDecl(writer);            if (count < 0)                return -1;            sum += count;            count = xmlOutputBufferWriteString(writer->out, ">");            if (count < 0)                return -1;            sum += count;            /* fallthrough */        case XML_TEXTWRITER_TEXT:            count = xmlOutputBufferWriteString(writer->out, "</");            if (count < 0)                return -1;            sum += count;            count = xmlOutputBufferWriteString(writer->out,                                               (const char *) p->name);            if (count < 0)                return -1;            sum += count;            count = xmlOutputBufferWriteString(writer->out, ">");            if (count < 0)                return -1;            sum += count;            break;        default:            return -1;    }    xmlListPopFront(writer->nodes);    return sum;}/** * xmlTextWriterWriteFormatRaw: * @writer:  the xmlTextWriterPtr * @format:  format string (see printf) * @...:  extra parameters for the format * * Write a formatted raw xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */int XMLCDECLxmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer, const char *format,                            ...){    int rc;    va_list ap;    va_start(ap, format);    rc = xmlTextWriterWriteVFormatRaw(writer, format, ap);    va_end(ap);    return rc;}/** * xmlTextWriterWriteVFormatRaw: * @writer:  the xmlTextWriterPtr * @format:  format string (see printf) * @argptr:  pointer to the first member of the variable argument list. * * Write a formatted raw xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer, const char *format,                             va_list argptr){    int rc;    xmlChar *buf;    if (writer == NULL)        return -1;    buf = xmlTextWriterVSprintf(format, argptr);    if (buf == 0)        return 0;    rc = xmlTextWriterWriteRaw(writer, buf);    xmlFree(buf);    return rc;}/** * xmlTextWriterWriteRawLen: * @writer:  the xmlTextWriterPtr * @content:  text string * @len:  length of the text string * * Write an xml text. * TODO: what about entities and special chars?? * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterWriteRawLen(xmlTextWriterPtr writer, const xmlChar * content,                         int len){    int count;    int sum;    xmlLinkPtr lk;    xmlTextWriterStackEntry *p;    if (writer == NULL) {        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,                        "xmlTextWriterWriteRawLen : invalid writer!\n");        return -1;    }    if ((content == NULL) || (len < 0)) {        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,                        "xmlTextWriterWriteRawLen : invalid content!\n");        return -1;    }    sum = 0;    lk = xmlListFront(writer->nodes);    if (lk != 0) {        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);        count = xmlTextWriterHandleStateDependencies(writer, p);        if (count < 0)            return -1;        sum += count;    }    if (writer->indent)        writer->doindent = 0;    if (content != NULL) {        count =            xmlOutputBufferWrite(writer->out, len, (const char *) content);        if (count < 0)            return -1;        sum += count;    }    return sum;}/** * xmlTextWriterWriteRaw: * @writer:  the xmlTextWriterPtr * @content:  text string * * Write a raw xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterWriteRaw(xmlTextWriterPtr writer, const xmlChar * content){    return xmlTextWriterWriteRawLen(writer, content, xmlStrlen(content));}/** * xmlTextWriterWriteFormatString: * @writer:  the xmlTextWriterPtr * @format:  format string (see printf) * @...:  extra parameters for the format * * Write a formatted xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */int XMLCDECLxmlTextWriterWriteFormatString(xmlTextWriterPtr writer, const char *format,                               ...){    int rc;    va_list ap;    if ((writer == NULL) || (format == NULL))        return -1;    va_start(ap, format);    rc = xmlTextWriterWriteVFormatString(writer, format, ap);    va_end(ap);    return rc;}/** * xmlTextWriterWriteVFormatString: * @writer:  the xmlTextWriterPtr * @format:  format string (see printf) * @argptr:  pointer to the first member of the variable argument list. * * Write a formatted xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterWriteVFormatString(xmlTextWriterPtr writer,                                const char *format, va_list argptr){    int rc;    xmlChar *buf;    if ((writer == NULL) || (format == NULL))        return -1;    buf = xmlTextWriterVSprintf(format, argptr);    if (buf == 0)        return 0;    rc = xmlTextWriterWriteString(writer, buf);    xmlFree(buf);    return rc;}/** * xmlTextWriterWriteString: * @writer:  the xmlTextWriterPtr * @content:  text string * * Write an xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error

⌨️ 快捷键说明

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