libxml C语言写xml文档

来源:互联网 发布:数据结构与算法考试题 编辑:程序博客网 时间:2024/04/27 17:14

1. 示例源码

#include <stdio.h>#include <string.h>#include <libxml/encoding.h>#include <libxml/xmlwriter.h>#define MY_ENCODING "ISO-8859-1"xmlChar *ConvertInput(const char *in, const char *encoding);void testXmlwriterFilename(const char *uri);voidtestXmlwriterFilename(const char *uri){    int rc;    xmlTextWriterPtr writer;    xmlChar *tmp;    /* Create a new XmlWriter for uri, with no compression. */    writer = xmlNewTextWriterFilename(uri, 0);    if (writer == NULL) {        printf("testXmlwriterFilename: Error creating the xml writer\n");        return;    }    /* Start the document with the xml default for the version,     * encoding ISO 8859-1 and the default for the standalone     * declaration. */    rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterStartDocument\n");        return;    }    /* Start an element named "EXAMPLE". Since thist is the first     * element, this will be the root element of the document. */    rc = xmlTextWriterStartElement(writer, BAD_CAST "EXAMPLE");    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");        return;    }    /* Write a comment as child of EXAMPLE.     * Please observe, that the input to the xmlTextWriter functions     * HAS to be in UTF-8, even if the output XML is encoded     * in iso-8859-1 */    tmp = ConvertInput("This is a comment with special chars: love",                       MY_ENCODING);    rc = xmlTextWriterWriteComment(writer, tmp);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterWriteComment\n");        return;    }    if (tmp != NULL) xmlFree(tmp);    /* Start an element named "ORDER" as child of EXAMPLE. */    rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER");    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");        return;    }    /* Add an attribute with name "version" and value "1.0" to ORDER. */    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version",                                     BAD_CAST "1.0");    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterWriteAttribute\n");        return;    }    /* Add an attribute with name "xml:lang" and value "de" to ORDER. */    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang",                                     BAD_CAST "English");    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterWriteAttribute\n");        return;    }    /* Write a comment as child of ORDER */    tmp = ConvertInput("hate", MY_ENCODING);    rc = xmlTextWriterWriteFormatComment(writer,     "This is another comment with special chars: %s",     tmp);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatComment\n");        return;    }    if (tmp != NULL) xmlFree(tmp);    /* Start an element named "HEADER" as child of ORDER. */// 开始写入HEADER结点    rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER");    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");        return;    }    /* Write an element named "X_ORDER_ID" as child of HEADER. */    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID",                                         "%010d", 53535);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");        return;    }    /* Write an element named "CUSTOMER_ID" as child of HEADER. */    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID",                                         "%d", 1010);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");        return;    }    /* Write an element named "NAME_1" as child of HEADER. */    tmp = ConvertInput("Muller", MY_ENCODING);    rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_1", tmp);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");        return;    }    if (tmp != NULL) xmlFree(tmp);    /* Write an element named "NAME_2" as child of HEADER. */    tmp = ConvertInput("Jorge", MY_ENCODING);    rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_2", tmp);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");        return;    }    if (tmp != NULL) xmlFree(tmp);    /* Close the element named HEADER. */// 停止写入HEADER结点    rc = xmlTextWriterEndElement(writer);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");        return;    }    /* Start an element named "ENTRIES" as child of ORDER. */    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES");    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");        return;    }    /* Start an element named "ENTRY" as child of ENTRIES. */    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");        return;    }    /* Write an element named "ARTICLE" as child of ENTRY. */    rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",                                   BAD_CAST "<Test>");    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");        return;    }    /* Write an element named "ENTRY_NO" as child of ENTRY. */    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",                                         10);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");        return;    }    /* Close the element named ENTRY. */    rc = xmlTextWriterEndElement(writer);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");        return;    }    /* Start an element named "ENTRY" as child of ENTRIES. */    rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");        return;    }    /* Write an element named "ARTICLE" as child of ENTRY. */// 写入一个元素    rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",                                   BAD_CAST "<Test 2>");    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");        return;    }    /* Write an element named "ENTRY_NO" as child of ENTRY. */    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",                                         20);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");        return;    }    /* Close the element named ENTRY. */    rc = xmlTextWriterEndElement(writer);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");        return;    }    /* Close the element named ENTRIES. */    rc = xmlTextWriterEndElement(writer);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");        return;    }    /* Start an element named "FOOTER" as child of ORDER. */    rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER");    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");        return;    }    /* Write an element named "TEXT" as child of FOOTER. */    rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT",                                   BAD_CAST "This is a text.");    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");        return;    }    /* Close the element named FOOTER. */    rc = xmlTextWriterEndElement(writer);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");        return;    }    /* Here we could close the elements ORDER and EXAMPLE using the     * function xmlTextWriterEndElement, but since we do not want to     * write any other elements, we simply call xmlTextWriterEndDocument,     * which will do all the work. */    rc = xmlTextWriterEndDocument(writer);    if (rc < 0) {        printf            ("testXmlwriterFilename: Error at xmlTextWriterEndDocument\n");        return;    }    xmlFreeTextWriter(writer);}xmlChar *ConvertInput(const char *in, const char *encoding){    xmlChar *out;    int ret;    int size;    int out_size;    int temp;    xmlCharEncodingHandlerPtr handler;    if (in == 0)        return 0;    handler = xmlFindCharEncodingHandler(encoding);    if (!handler) {        printf("ConvertInput: no encoding handler found for '%s'\n",               encoding ? encoding : "");        return 0;    }    size = (int) strlen(in) + 1;    out_size = size * 2 - 1;    out = (unsigned char *) xmlMalloc((size_t) out_size);    if (out != 0) {        temp = size - 1;        ret = handler->input(out, &out_size, (const xmlChar *) in, &temp);        if ((ret < 0) || (temp - size + 1)) {            if (ret < 0) {                printf("ConvertInput: conversion wasn't successful.\n");            } else {                printf                    ("ConvertInput: conversion wasn't successful. converted: %i octets.\n",                     temp);            }            xmlFree(out);            out = 0;        } else {            out = (unsigned char *) xmlRealloc(out, out_size + 1);            out[out_size] = 0;  /*null terminating out */        }    } else {        printf("ConvertInput: no mem\n");    }    return out;}int main(int argc, char **argv) {/*    if (argc != 2) {printf("Parameter too litter!\n");        return(1);}*/    /*     * this initialize the library and check potential ABI mismatches     * between the version it was compiled for and the actual shared     * library used.     */    LIBXML_TEST_VERSIONtestXmlwriterFilename(argv[1]);    /*     * Cleanup function for the XML library     */    xmlCleanupParser();    /*     * this is to debug memory for regression tests     */    xmlMemoryDump();    return(0);}

2. 运行

./xml_writer writer.xml


3. 输出文档writer.xml

writer.xml内容如下:

<?xml version="1.0" encoding="ISO-8859-1"?><EXAMPLE><!-- This is a comment with special chars: love --><ORDER version="1.0" xml:lang="English"><!-- This is another comment with special chars: hate --><HEADER><X_ORDER_ID>0000053535</X_ORDER_ID><CUSTOMER_ID>1010</CUSTOMER_ID><NAME_1>Muller</NAME_1><NAME_2>Jorge</NAME_2></HEADER><ENTRIES><ENTRY><ARTICLE><Test></ARTICLE><ENTRY_NO>10</ENTRY_NO></ENTRY><ENTRY><ARTICLE><Test 2></ARTICLE><ENTRY_NO>20</ENTRY_NO></ENTRY></ENTRIES><FOOTER><TEXT>This is a text.</TEXT></FOOTER></ORDER></EXAMPLE>



原创粉丝点击