Annotation of embedaddon/libxml2/doc/examples/testWriter.c, revision 1.1

1.1     ! misho       1: /**
        !             2:  * section: xmlWriter
        !             3:  * synopsis: use various APIs for the xmlWriter
        !             4:  * purpose: tests a number of APIs for the xmlWriter, especially
        !             5:  *          the various methods to write to a filename, to a memory
        !             6:  *          buffer, to a new document, or to a subtree. It shows how to
        !             7:  *          do encoding string conversions too. The resulting
        !             8:  *          documents are then serialized.
        !             9:  * usage: testWriter
        !            10:  * test: testWriter ; for i in 1 2 3 4 ; do diff writer.xml writer$$i.res ; done ; rm writer*.res
        !            11:  * author: Alfred Mickautsch
        !            12:  * copy: see Copyright for the status of this software.
        !            13:  */
        !            14: #include <stdio.h>
        !            15: #include <string.h>
        !            16: #include <libxml/encoding.h>
        !            17: #include <libxml/xmlwriter.h>
        !            18: 
        !            19: #if defined(LIBXML_WRITER_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
        !            20: 
        !            21: #define MY_ENCODING "ISO-8859-1"
        !            22: 
        !            23: void testXmlwriterFilename(const char *uri);
        !            24: void testXmlwriterMemory(const char *file);
        !            25: void testXmlwriterDoc(const char *file);
        !            26: void testXmlwriterTree(const char *file);
        !            27: xmlChar *ConvertInput(const char *in, const char *encoding);
        !            28: 
        !            29: int
        !            30: main(void)
        !            31: {
        !            32:     /*
        !            33:      * this initialize the library and check potential ABI mismatches
        !            34:      * between the version it was compiled for and the actual shared
        !            35:      * library used.
        !            36:      */
        !            37:     LIBXML_TEST_VERSION
        !            38: 
        !            39:     /* first, the file version */
        !            40:     testXmlwriterFilename("writer1.res");
        !            41: 
        !            42:     /* next, the memory version */
        !            43:     testXmlwriterMemory("writer2.res");
        !            44: 
        !            45:     /* next, the DOM version */
        !            46:     testXmlwriterDoc("writer3.res");
        !            47: 
        !            48:     /* next, the tree version */
        !            49:     testXmlwriterTree("writer4.res");
        !            50: 
        !            51:     /*
        !            52:      * Cleanup function for the XML library.
        !            53:      */
        !            54:     xmlCleanupParser();
        !            55:     /*
        !            56:      * this is to debug memory for regression tests
        !            57:      */
        !            58:     xmlMemoryDump();
        !            59:     return 0;
        !            60: }
        !            61: 
        !            62: /**
        !            63:  * testXmlwriterFilename:
        !            64:  * @uri: the output URI
        !            65:  *
        !            66:  * test the xmlWriter interface when writing to a new file
        !            67:  */
        !            68: void
        !            69: testXmlwriterFilename(const char *uri)
        !            70: {
        !            71:     int rc;
        !            72:     xmlTextWriterPtr writer;
        !            73:     xmlChar *tmp;
        !            74: 
        !            75:     /* Create a new XmlWriter for uri, with no compression. */
        !            76:     writer = xmlNewTextWriterFilename(uri, 0);
        !            77:     if (writer == NULL) {
        !            78:         printf("testXmlwriterFilename: Error creating the xml writer\n");
        !            79:         return;
        !            80:     }
        !            81: 
        !            82:     /* Start the document with the xml default for the version,
        !            83:      * encoding ISO 8859-1 and the default for the standalone
        !            84:      * declaration. */
        !            85:     rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
        !            86:     if (rc < 0) {
        !            87:         printf
        !            88:             ("testXmlwriterFilename: Error at xmlTextWriterStartDocument\n");
        !            89:         return;
        !            90:     }
        !            91: 
        !            92:     /* Start an element named "EXAMPLE". Since thist is the first
        !            93:      * element, this will be the root element of the document. */
        !            94:     rc = xmlTextWriterStartElement(writer, BAD_CAST "EXAMPLE");
        !            95:     if (rc < 0) {
        !            96:         printf
        !            97:             ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        !            98:         return;
        !            99:     }
        !           100: 
        !           101:     /* Write a comment as child of EXAMPLE.
        !           102:      * Please observe, that the input to the xmlTextWriter functions
        !           103:      * HAS to be in UTF-8, even if the output XML is encoded
        !           104:      * in iso-8859-1 */
        !           105:     tmp = ConvertInput("This is a comment with special chars: <äöü>",
        !           106:                        MY_ENCODING);
        !           107:     rc = xmlTextWriterWriteComment(writer, tmp);
        !           108:     if (rc < 0) {
        !           109:         printf
        !           110:             ("testXmlwriterFilename: Error at xmlTextWriterWriteComment\n");
        !           111:         return;
        !           112:     }
        !           113:     if (tmp != NULL) xmlFree(tmp);
        !           114: 
        !           115:     /* Start an element named "ORDER" as child of EXAMPLE. */
        !           116:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER");
        !           117:     if (rc < 0) {
        !           118:         printf
        !           119:             ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        !           120:         return;
        !           121:     }
        !           122: 
        !           123:     /* Add an attribute with name "version" and value "1.0" to ORDER. */
        !           124:     rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version",
        !           125:                                      BAD_CAST "1.0");
        !           126:     if (rc < 0) {
        !           127:         printf
        !           128:             ("testXmlwriterFilename: Error at xmlTextWriterWriteAttribute\n");
        !           129:         return;
        !           130:     }
        !           131: 
        !           132:     /* Add an attribute with name "xml:lang" and value "de" to ORDER. */
        !           133:     rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang",
        !           134:                                      BAD_CAST "de");
        !           135:     if (rc < 0) {
        !           136:         printf
        !           137:             ("testXmlwriterFilename: Error at xmlTextWriterWriteAttribute\n");
        !           138:         return;
        !           139:     }
        !           140: 
        !           141:     /* Write a comment as child of ORDER */
        !           142:     tmp = ConvertInput("<äöü>", MY_ENCODING);
        !           143:     rc = xmlTextWriterWriteFormatComment(writer,
        !           144:                     "This is another comment with special chars: %s",
        !           145:                     tmp);
        !           146:     if (rc < 0) {
        !           147:         printf
        !           148:             ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatComment\n");
        !           149:         return;
        !           150:     }
        !           151:     if (tmp != NULL) xmlFree(tmp);
        !           152: 
        !           153:     /* Start an element named "HEADER" as child of ORDER. */
        !           154:     rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER");
        !           155:     if (rc < 0) {
        !           156:         printf
        !           157:             ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        !           158:         return;
        !           159:     }
        !           160: 
        !           161:     /* Write an element named "X_ORDER_ID" as child of HEADER. */
        !           162:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID",
        !           163:                                          "%010d", 53535L);
        !           164:     if (rc < 0) {
        !           165:         printf
        !           166:             ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
        !           167:         return;
        !           168:     }
        !           169: 
        !           170:     /* Write an element named "CUSTOMER_ID" as child of HEADER. */
        !           171:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID",
        !           172:                                          "%d", 1010);
        !           173:     if (rc < 0) {
        !           174:         printf
        !           175:             ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
        !           176:         return;
        !           177:     }
        !           178: 
        !           179:     /* Write an element named "NAME_1" as child of HEADER. */
        !           180:     tmp = ConvertInput("Müller", MY_ENCODING);
        !           181:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_1", tmp);
        !           182:     if (rc < 0) {
        !           183:         printf
        !           184:             ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
        !           185:         return;
        !           186:     }
        !           187:     if (tmp != NULL) xmlFree(tmp);
        !           188: 
        !           189:     /* Write an element named "NAME_2" as child of HEADER. */
        !           190:     tmp = ConvertInput("Jörg", MY_ENCODING);
        !           191:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_2", tmp);
        !           192:     if (rc < 0) {
        !           193:         printf
        !           194:             ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
        !           195:         return;
        !           196:     }
        !           197:     if (tmp != NULL) xmlFree(tmp);
        !           198: 
        !           199:     /* Close the element named HEADER. */
        !           200:     rc = xmlTextWriterEndElement(writer);
        !           201:     if (rc < 0) {
        !           202:         printf
        !           203:             ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
        !           204:         return;
        !           205:     }
        !           206: 
        !           207:     /* Start an element named "ENTRIES" as child of ORDER. */
        !           208:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES");
        !           209:     if (rc < 0) {
        !           210:         printf
        !           211:             ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        !           212:         return;
        !           213:     }
        !           214: 
        !           215:     /* Start an element named "ENTRY" as child of ENTRIES. */
        !           216:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
        !           217:     if (rc < 0) {
        !           218:         printf
        !           219:             ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        !           220:         return;
        !           221:     }
        !           222: 
        !           223:     /* Write an element named "ARTICLE" as child of ENTRY. */
        !           224:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
        !           225:                                    BAD_CAST "<Test>");
        !           226:     if (rc < 0) {
        !           227:         printf
        !           228:             ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
        !           229:         return;
        !           230:     }
        !           231: 
        !           232:     /* Write an element named "ENTRY_NO" as child of ENTRY. */
        !           233:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
        !           234:                                          10);
        !           235:     if (rc < 0) {
        !           236:         printf
        !           237:             ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
        !           238:         return;
        !           239:     }
        !           240: 
        !           241:     /* Close the element named ENTRY. */
        !           242:     rc = xmlTextWriterEndElement(writer);
        !           243:     if (rc < 0) {
        !           244:         printf
        !           245:             ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
        !           246:         return;
        !           247:     }
        !           248: 
        !           249:     /* Start an element named "ENTRY" as child of ENTRIES. */
        !           250:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
        !           251:     if (rc < 0) {
        !           252:         printf
        !           253:             ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        !           254:         return;
        !           255:     }
        !           256: 
        !           257:     /* Write an element named "ARTICLE" as child of ENTRY. */
        !           258:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
        !           259:                                    BAD_CAST "<Test 2>");
        !           260:     if (rc < 0) {
        !           261:         printf
        !           262:             ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
        !           263:         return;
        !           264:     }
        !           265: 
        !           266:     /* Write an element named "ENTRY_NO" as child of ENTRY. */
        !           267:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
        !           268:                                          20);
        !           269:     if (rc < 0) {
        !           270:         printf
        !           271:             ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
        !           272:         return;
        !           273:     }
        !           274: 
        !           275:     /* Close the element named ENTRY. */
        !           276:     rc = xmlTextWriterEndElement(writer);
        !           277:     if (rc < 0) {
        !           278:         printf
        !           279:             ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
        !           280:         return;
        !           281:     }
        !           282: 
        !           283:     /* Close the element named ENTRIES. */
        !           284:     rc = xmlTextWriterEndElement(writer);
        !           285:     if (rc < 0) {
        !           286:         printf
        !           287:             ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
        !           288:         return;
        !           289:     }
        !           290: 
        !           291:     /* Start an element named "FOOTER" as child of ORDER. */
        !           292:     rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER");
        !           293:     if (rc < 0) {
        !           294:         printf
        !           295:             ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
        !           296:         return;
        !           297:     }
        !           298: 
        !           299:     /* Write an element named "TEXT" as child of FOOTER. */
        !           300:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT",
        !           301:                                    BAD_CAST "This is a text.");
        !           302:     if (rc < 0) {
        !           303:         printf
        !           304:             ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
        !           305:         return;
        !           306:     }
        !           307: 
        !           308:     /* Close the element named FOOTER. */
        !           309:     rc = xmlTextWriterEndElement(writer);
        !           310:     if (rc < 0) {
        !           311:         printf
        !           312:             ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
        !           313:         return;
        !           314:     }
        !           315: 
        !           316:     /* Here we could close the elements ORDER and EXAMPLE using the
        !           317:      * function xmlTextWriterEndElement, but since we do not want to
        !           318:      * write any other elements, we simply call xmlTextWriterEndDocument,
        !           319:      * which will do all the work. */
        !           320:     rc = xmlTextWriterEndDocument(writer);
        !           321:     if (rc < 0) {
        !           322:         printf
        !           323:             ("testXmlwriterFilename: Error at xmlTextWriterEndDocument\n");
        !           324:         return;
        !           325:     }
        !           326: 
        !           327:     xmlFreeTextWriter(writer);
        !           328: }
        !           329: 
        !           330: /**
        !           331:  * testXmlwriterMemory:
        !           332:  * @file: the output file
        !           333:  *
        !           334:  * test the xmlWriter interface when writing to memory
        !           335:  */
        !           336: void
        !           337: testXmlwriterMemory(const char *file)
        !           338: {
        !           339:     int rc;
        !           340:     xmlTextWriterPtr writer;
        !           341:     xmlBufferPtr buf;
        !           342:     xmlChar *tmp;
        !           343:     FILE *fp;
        !           344: 
        !           345:     /* Create a new XML buffer, to which the XML document will be
        !           346:      * written */
        !           347:     buf = xmlBufferCreate();
        !           348:     if (buf == NULL) {
        !           349:         printf("testXmlwriterMemory: Error creating the xml buffer\n");
        !           350:         return;
        !           351:     }
        !           352: 
        !           353:     /* Create a new XmlWriter for memory, with no compression.
        !           354:      * Remark: there is no compression for this kind of xmlTextWriter */
        !           355:     writer = xmlNewTextWriterMemory(buf, 0);
        !           356:     if (writer == NULL) {
        !           357:         printf("testXmlwriterMemory: Error creating the xml writer\n");
        !           358:         return;
        !           359:     }
        !           360: 
        !           361:     /* Start the document with the xml default for the version,
        !           362:      * encoding ISO 8859-1 and the default for the standalone
        !           363:      * declaration. */
        !           364:     rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
        !           365:     if (rc < 0) {
        !           366:         printf
        !           367:             ("testXmlwriterMemory: Error at xmlTextWriterStartDocument\n");
        !           368:         return;
        !           369:     }
        !           370: 
        !           371:     /* Start an element named "EXAMPLE". Since thist is the first
        !           372:      * element, this will be the root element of the document. */
        !           373:     rc = xmlTextWriterStartElement(writer, BAD_CAST "EXAMPLE");
        !           374:     if (rc < 0) {
        !           375:         printf
        !           376:             ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        !           377:         return;
        !           378:     }
        !           379: 
        !           380:     /* Write a comment as child of EXAMPLE.
        !           381:      * Please observe, that the input to the xmlTextWriter functions
        !           382:      * HAS to be in UTF-8, even if the output XML is encoded
        !           383:      * in iso-8859-1 */
        !           384:     tmp = ConvertInput("This is a comment with special chars: <äöü>",
        !           385:                        MY_ENCODING);
        !           386:     rc = xmlTextWriterWriteComment(writer, tmp);
        !           387:     if (rc < 0) {
        !           388:         printf
        !           389:             ("testXmlwriterMemory: Error at xmlTextWriterWriteComment\n");
        !           390:         return;
        !           391:     }
        !           392:     if (tmp != NULL) xmlFree(tmp);
        !           393: 
        !           394:     /* Start an element named "ORDER" as child of EXAMPLE. */
        !           395:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER");
        !           396:     if (rc < 0) {
        !           397:         printf
        !           398:             ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        !           399:         return;
        !           400:     }
        !           401: 
        !           402:     /* Add an attribute with name "version" and value "1.0" to ORDER. */
        !           403:     rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version",
        !           404:                                      BAD_CAST "1.0");
        !           405:     if (rc < 0) {
        !           406:         printf
        !           407:             ("testXmlwriterMemory: Error at xmlTextWriterWriteAttribute\n");
        !           408:         return;
        !           409:     }
        !           410: 
        !           411:     /* Add an attribute with name "xml:lang" and value "de" to ORDER. */
        !           412:     rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang",
        !           413:                                      BAD_CAST "de");
        !           414:     if (rc < 0) {
        !           415:         printf
        !           416:             ("testXmlwriterMemory: Error at xmlTextWriterWriteAttribute\n");
        !           417:         return;
        !           418:     }
        !           419: 
        !           420:     /* Write a comment as child of ORDER */
        !           421:     tmp = ConvertInput("<äöü>", MY_ENCODING);
        !           422:     rc = xmlTextWriterWriteFormatComment(writer,
        !           423:                     "This is another comment with special chars: %s",
        !           424:                                          tmp);
        !           425:     if (rc < 0) {
        !           426:         printf
        !           427:             ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatComment\n");
        !           428:         return;
        !           429:     }
        !           430:     if (tmp != NULL) xmlFree(tmp);
        !           431: 
        !           432:     /* Start an element named "HEADER" as child of ORDER. */
        !           433:     rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER");
        !           434:     if (rc < 0) {
        !           435:         printf
        !           436:             ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        !           437:         return;
        !           438:     }
        !           439: 
        !           440:     /* Write an element named "X_ORDER_ID" as child of HEADER. */
        !           441:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID",
        !           442:                                          "%010d", 53535L);
        !           443:     if (rc < 0) {
        !           444:         printf
        !           445:             ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n");
        !           446:         return;
        !           447:     }
        !           448: 
        !           449:     /* Write an element named "CUSTOMER_ID" as child of HEADER. */
        !           450:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID",
        !           451:                                          "%d", 1010);
        !           452:     if (rc < 0) {
        !           453:         printf
        !           454:             ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n");
        !           455:         return;
        !           456:     }
        !           457: 
        !           458:     /* Write an element named "NAME_1" as child of HEADER. */
        !           459:     tmp = ConvertInput("Müller", MY_ENCODING);
        !           460:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_1", tmp);
        !           461:     if (rc < 0) {
        !           462:         printf
        !           463:             ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
        !           464:         return;
        !           465:     }
        !           466:     if (tmp != NULL) xmlFree(tmp);
        !           467: 
        !           468:     /* Write an element named "NAME_2" as child of HEADER. */
        !           469:     tmp = ConvertInput("Jörg", MY_ENCODING);
        !           470:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_2", tmp);
        !           471:                                    
        !           472:     if (rc < 0) {
        !           473:         printf
        !           474:             ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
        !           475:         return;
        !           476:     }
        !           477:     if (tmp != NULL) xmlFree(tmp);
        !           478: 
        !           479:     /* Close the element named HEADER. */
        !           480:     rc = xmlTextWriterEndElement(writer);
        !           481:     if (rc < 0) {
        !           482:         printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
        !           483:         return;
        !           484:     }
        !           485: 
        !           486:     /* Start an element named "ENTRIES" as child of ORDER. */
        !           487:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES");
        !           488:     if (rc < 0) {
        !           489:         printf
        !           490:             ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        !           491:         return;
        !           492:     }
        !           493: 
        !           494:     /* Start an element named "ENTRY" as child of ENTRIES. */
        !           495:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
        !           496:     if (rc < 0) {
        !           497:         printf
        !           498:             ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        !           499:         return;
        !           500:     }
        !           501: 
        !           502:     /* Write an element named "ARTICLE" as child of ENTRY. */
        !           503:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
        !           504:                                    BAD_CAST "<Test>");
        !           505:     if (rc < 0) {
        !           506:         printf
        !           507:             ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
        !           508:         return;
        !           509:     }
        !           510: 
        !           511:     /* Write an element named "ENTRY_NO" as child of ENTRY. */
        !           512:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
        !           513:                                          10);
        !           514:     if (rc < 0) {
        !           515:         printf
        !           516:             ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n");
        !           517:         return;
        !           518:     }
        !           519: 
        !           520:     /* Close the element named ENTRY. */
        !           521:     rc = xmlTextWriterEndElement(writer);
        !           522:     if (rc < 0) {
        !           523:         printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
        !           524:         return;
        !           525:     }
        !           526: 
        !           527:     /* Start an element named "ENTRY" as child of ENTRIES. */
        !           528:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
        !           529:     if (rc < 0) {
        !           530:         printf
        !           531:             ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        !           532:         return;
        !           533:     }
        !           534: 
        !           535:     /* Write an element named "ARTICLE" as child of ENTRY. */
        !           536:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
        !           537:                                    BAD_CAST "<Test 2>");
        !           538:     if (rc < 0) {
        !           539:         printf
        !           540:             ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
        !           541:         return;
        !           542:     }
        !           543: 
        !           544:     /* Write an element named "ENTRY_NO" as child of ENTRY. */
        !           545:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
        !           546:                                          20);
        !           547:     if (rc < 0) {
        !           548:         printf
        !           549:             ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n");
        !           550:         return;
        !           551:     }
        !           552: 
        !           553:     /* Close the element named ENTRY. */
        !           554:     rc = xmlTextWriterEndElement(writer);
        !           555:     if (rc < 0) {
        !           556:         printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
        !           557:         return;
        !           558:     }
        !           559: 
        !           560:     /* Close the element named ENTRIES. */
        !           561:     rc = xmlTextWriterEndElement(writer);
        !           562:     if (rc < 0) {
        !           563:         printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
        !           564:         return;
        !           565:     }
        !           566: 
        !           567:     /* Start an element named "FOOTER" as child of ORDER. */
        !           568:     rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER");
        !           569:     if (rc < 0) {
        !           570:         printf
        !           571:             ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
        !           572:         return;
        !           573:     }
        !           574: 
        !           575:     /* Write an element named "TEXT" as child of FOOTER. */
        !           576:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT",
        !           577:                                    BAD_CAST "This is a text.");
        !           578:     if (rc < 0) {
        !           579:         printf
        !           580:             ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
        !           581:         return;
        !           582:     }
        !           583: 
        !           584:     /* Close the element named FOOTER. */
        !           585:     rc = xmlTextWriterEndElement(writer);
        !           586:     if (rc < 0) {
        !           587:         printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
        !           588:         return;
        !           589:     }
        !           590: 
        !           591:     /* Here we could close the elements ORDER and EXAMPLE using the
        !           592:      * function xmlTextWriterEndElement, but since we do not want to
        !           593:      * write any other elements, we simply call xmlTextWriterEndDocument,
        !           594:      * which will do all the work. */
        !           595:     rc = xmlTextWriterEndDocument(writer);
        !           596:     if (rc < 0) {
        !           597:         printf("testXmlwriterMemory: Error at xmlTextWriterEndDocument\n");
        !           598:         return;
        !           599:     }
        !           600: 
        !           601:     xmlFreeTextWriter(writer);
        !           602: 
        !           603:     fp = fopen(file, "w");
        !           604:     if (fp == NULL) {
        !           605:         printf("testXmlwriterMemory: Error at fopen\n");
        !           606:         return;
        !           607:     }
        !           608: 
        !           609:     fprintf(fp, "%s", (const char *) buf->content);
        !           610: 
        !           611:     fclose(fp);
        !           612: 
        !           613:     xmlBufferFree(buf);
        !           614: }
        !           615: 
        !           616: /**
        !           617:  * testXmlwriterDoc:
        !           618:  * @file: the output file
        !           619:  *
        !           620:  * test the xmlWriter interface when creating a new document
        !           621:  */
        !           622: void
        !           623: testXmlwriterDoc(const char *file)
        !           624: {
        !           625:     int rc;
        !           626:     xmlTextWriterPtr writer;
        !           627:     xmlChar *tmp;
        !           628:     xmlDocPtr doc;
        !           629: 
        !           630: 
        !           631:     /* Create a new XmlWriter for DOM, with no compression. */
        !           632:     writer = xmlNewTextWriterDoc(&doc, 0);
        !           633:     if (writer == NULL) {
        !           634:         printf("testXmlwriterDoc: Error creating the xml writer\n");
        !           635:         return;
        !           636:     }
        !           637: 
        !           638:     /* Start the document with the xml default for the version,
        !           639:      * encoding ISO 8859-1 and the default for the standalone
        !           640:      * declaration. */
        !           641:     rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
        !           642:     if (rc < 0) {
        !           643:         printf("testXmlwriterDoc: Error at xmlTextWriterStartDocument\n");
        !           644:         return;
        !           645:     }
        !           646: 
        !           647:     /* Start an element named "EXAMPLE". Since thist is the first
        !           648:      * element, this will be the root element of the document. */
        !           649:     rc = xmlTextWriterStartElement(writer, BAD_CAST "EXAMPLE");
        !           650:     if (rc < 0) {
        !           651:         printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        !           652:         return;
        !           653:     }
        !           654: 
        !           655:     /* Write a comment as child of EXAMPLE.
        !           656:      * Please observe, that the input to the xmlTextWriter functions
        !           657:      * HAS to be in UTF-8, even if the output XML is encoded
        !           658:      * in iso-8859-1 */
        !           659:     tmp = ConvertInput("This is a comment with special chars: <äöü>",
        !           660:                        MY_ENCODING);
        !           661:     rc = xmlTextWriterWriteComment(writer, tmp);
        !           662:     if (rc < 0) {
        !           663:         printf("testXmlwriterDoc: Error at xmlTextWriterWriteComment\n");
        !           664:         return;
        !           665:     }
        !           666:     if (tmp != NULL) xmlFree(tmp);
        !           667: 
        !           668:     /* Start an element named "ORDER" as child of EXAMPLE. */
        !           669:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER");
        !           670:     if (rc < 0) {
        !           671:         printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        !           672:         return;
        !           673:     }
        !           674: 
        !           675:     /* Add an attribute with name "version" and value "1.0" to ORDER. */
        !           676:     rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version",
        !           677:                                      BAD_CAST "1.0");
        !           678:     if (rc < 0) {
        !           679:         printf("testXmlwriterDoc: Error at xmlTextWriterWriteAttribute\n");
        !           680:         return;
        !           681:     }
        !           682: 
        !           683:     /* Add an attribute with name "xml:lang" and value "de" to ORDER. */
        !           684:     rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang",
        !           685:                                      BAD_CAST "de");
        !           686:     if (rc < 0) {
        !           687:         printf("testXmlwriterDoc: Error at xmlTextWriterWriteAttribute\n");
        !           688:         return;
        !           689:     }
        !           690: 
        !           691:     /* Write a comment as child of ORDER */
        !           692:     tmp = ConvertInput("<äöü>", MY_ENCODING);
        !           693:     rc = xmlTextWriterWriteFormatComment(writer,
        !           694:                 "This is another comment with special chars: %s",
        !           695:                                         tmp);
        !           696:     if (rc < 0) {
        !           697:         printf
        !           698:             ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatComment\n");
        !           699:         return;
        !           700:     }
        !           701:     if (tmp != NULL) xmlFree(tmp);
        !           702: 
        !           703:     /* Start an element named "HEADER" as child of ORDER. */
        !           704:     rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER");
        !           705:     if (rc < 0) {
        !           706:         printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        !           707:         return;
        !           708:     }
        !           709: 
        !           710:     /* Write an element named "X_ORDER_ID" as child of HEADER. */
        !           711:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID",
        !           712:                                          "%010d", 53535L);
        !           713:     if (rc < 0) {
        !           714:         printf
        !           715:             ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n");
        !           716:         return;
        !           717:     }
        !           718: 
        !           719:     /* Write an element named "CUSTOMER_ID" as child of HEADER. */
        !           720:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID",
        !           721:                                          "%d", 1010);
        !           722:     if (rc < 0) {
        !           723:         printf
        !           724:             ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n");
        !           725:         return;
        !           726:     }
        !           727: 
        !           728:     /* Write an element named "NAME_1" as child of HEADER. */
        !           729:     tmp = ConvertInput("Müller", MY_ENCODING);
        !           730:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_1", tmp);
        !           731:     if (rc < 0) {
        !           732:         printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
        !           733:         return;
        !           734:     }
        !           735:     if (tmp != NULL) xmlFree(tmp);
        !           736: 
        !           737:     /* Write an element named "NAME_2" as child of HEADER. */
        !           738:     tmp = ConvertInput("Jörg", MY_ENCODING);
        !           739:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_2", tmp);
        !           740:     if (rc < 0) {
        !           741:         printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
        !           742:         return;
        !           743:     }
        !           744:     if (tmp != NULL) xmlFree(tmp);
        !           745: 
        !           746:     /* Close the element named HEADER. */
        !           747:     rc = xmlTextWriterEndElement(writer);
        !           748:     if (rc < 0) {
        !           749:         printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
        !           750:         return;
        !           751:     }
        !           752: 
        !           753:     /* Start an element named "ENTRIES" as child of ORDER. */
        !           754:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES");
        !           755:     if (rc < 0) {
        !           756:         printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        !           757:         return;
        !           758:     }
        !           759: 
        !           760:     /* Start an element named "ENTRY" as child of ENTRIES. */
        !           761:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
        !           762:     if (rc < 0) {
        !           763:         printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        !           764:         return;
        !           765:     }
        !           766: 
        !           767:     /* Write an element named "ARTICLE" as child of ENTRY. */
        !           768:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
        !           769:                                    BAD_CAST "<Test>");
        !           770:     if (rc < 0) {
        !           771:         printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
        !           772:         return;
        !           773:     }
        !           774: 
        !           775:     /* Write an element named "ENTRY_NO" as child of ENTRY. */
        !           776:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
        !           777:                                          10);
        !           778:     if (rc < 0) {
        !           779:         printf
        !           780:             ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n");
        !           781:         return;
        !           782:     }
        !           783: 
        !           784:     /* Close the element named ENTRY. */
        !           785:     rc = xmlTextWriterEndElement(writer);
        !           786:     if (rc < 0) {
        !           787:         printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
        !           788:         return;
        !           789:     }
        !           790: 
        !           791:     /* Start an element named "ENTRY" as child of ENTRIES. */
        !           792:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
        !           793:     if (rc < 0) {
        !           794:         printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        !           795:         return;
        !           796:     }
        !           797: 
        !           798:     /* Write an element named "ARTICLE" as child of ENTRY. */
        !           799:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
        !           800:                                    BAD_CAST "<Test 2>");
        !           801:     if (rc < 0) {
        !           802:         printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
        !           803:         return;
        !           804:     }
        !           805: 
        !           806:     /* Write an element named "ENTRY_NO" as child of ENTRY. */
        !           807:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
        !           808:                                          20);
        !           809:     if (rc < 0) {
        !           810:         printf
        !           811:             ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n");
        !           812:         return;
        !           813:     }
        !           814: 
        !           815:     /* Close the element named ENTRY. */
        !           816:     rc = xmlTextWriterEndElement(writer);
        !           817:     if (rc < 0) {
        !           818:         printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
        !           819:         return;
        !           820:     }
        !           821: 
        !           822:     /* Close the element named ENTRIES. */
        !           823:     rc = xmlTextWriterEndElement(writer);
        !           824:     if (rc < 0) {
        !           825:         printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
        !           826:         return;
        !           827:     }
        !           828: 
        !           829:     /* Start an element named "FOOTER" as child of ORDER. */
        !           830:     rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER");
        !           831:     if (rc < 0) {
        !           832:         printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
        !           833:         return;
        !           834:     }
        !           835: 
        !           836:     /* Write an element named "TEXT" as child of FOOTER. */
        !           837:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT",
        !           838:                                    BAD_CAST "This is a text.");
        !           839:     if (rc < 0) {
        !           840:         printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
        !           841:         return;
        !           842:     }
        !           843: 
        !           844:     /* Close the element named FOOTER. */
        !           845:     rc = xmlTextWriterEndElement(writer);
        !           846:     if (rc < 0) {
        !           847:         printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
        !           848:         return;
        !           849:     }
        !           850: 
        !           851:     /* Here we could close the elements ORDER and EXAMPLE using the
        !           852:      * function xmlTextWriterEndElement, but since we do not want to
        !           853:      * write any other elements, we simply call xmlTextWriterEndDocument,
        !           854:      * which will do all the work. */
        !           855:     rc = xmlTextWriterEndDocument(writer);
        !           856:     if (rc < 0) {
        !           857:         printf("testXmlwriterDoc: Error at xmlTextWriterEndDocument\n");
        !           858:         return;
        !           859:     }
        !           860: 
        !           861:     xmlFreeTextWriter(writer);
        !           862: 
        !           863:     xmlSaveFileEnc(file, doc, MY_ENCODING);
        !           864: 
        !           865:     xmlFreeDoc(doc);
        !           866: }
        !           867: 
        !           868: /**
        !           869:  * testXmlwriterTree:
        !           870:  * @file: the output file
        !           871:  *
        !           872:  * test the xmlWriter interface when writing to a subtree
        !           873:  */
        !           874: void
        !           875: testXmlwriterTree(const char *file)
        !           876: {
        !           877:     int rc;
        !           878:     xmlTextWriterPtr writer;
        !           879:     xmlDocPtr doc;
        !           880:     xmlNodePtr node;
        !           881:     xmlChar *tmp;
        !           882: 
        !           883:     /* Create a new XML DOM tree, to which the XML document will be
        !           884:      * written */
        !           885:     doc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION);
        !           886:     if (doc == NULL) {
        !           887:         printf
        !           888:             ("testXmlwriterTree: Error creating the xml document tree\n");
        !           889:         return;
        !           890:     }
        !           891: 
        !           892:     /* Create a new XML node, to which the XML document will be
        !           893:      * appended */
        !           894:     node = xmlNewDocNode(doc, NULL, BAD_CAST "EXAMPLE", NULL);
        !           895:     if (node == NULL) {
        !           896:         printf("testXmlwriterTree: Error creating the xml node\n");
        !           897:         return;
        !           898:     }
        !           899: 
        !           900:     /* Make ELEMENT the root node of the tree */
        !           901:     xmlDocSetRootElement(doc, node);
        !           902: 
        !           903:     /* Create a new XmlWriter for DOM tree, with no compression. */
        !           904:     writer = xmlNewTextWriterTree(doc, node, 0);
        !           905:     if (writer == NULL) {
        !           906:         printf("testXmlwriterTree: Error creating the xml writer\n");
        !           907:         return;
        !           908:     }
        !           909: 
        !           910:     /* Start the document with the xml default for the version,
        !           911:      * encoding ISO 8859-1 and the default for the standalone
        !           912:      * declaration. */
        !           913:     rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
        !           914:     if (rc < 0) {
        !           915:         printf("testXmlwriterTree: Error at xmlTextWriterStartDocument\n");
        !           916:         return;
        !           917:     }
        !           918: 
        !           919:     /* Write a comment as child of EXAMPLE.
        !           920:      * Please observe, that the input to the xmlTextWriter functions
        !           921:      * HAS to be in UTF-8, even if the output XML is encoded
        !           922:      * in iso-8859-1 */
        !           923:     tmp = ConvertInput("This is a comment with special chars: <äöü>",
        !           924:                        MY_ENCODING);
        !           925:     rc = xmlTextWriterWriteComment(writer, tmp);
        !           926:     if (rc < 0) {
        !           927:         printf("testXmlwriterTree: Error at xmlTextWriterWriteComment\n");
        !           928:         return;
        !           929:     }
        !           930:     if (tmp != NULL) xmlFree(tmp);
        !           931: 
        !           932:     /* Start an element named "ORDER" as child of EXAMPLE. */
        !           933:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER");
        !           934:     if (rc < 0) {
        !           935:         printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
        !           936:         return;
        !           937:     }
        !           938: 
        !           939:     /* Add an attribute with name "version" and value "1.0" to ORDER. */
        !           940:     rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version",
        !           941:                                      BAD_CAST "1.0");
        !           942:     if (rc < 0) {
        !           943:         printf
        !           944:             ("testXmlwriterTree: Error at xmlTextWriterWriteAttribute\n");
        !           945:         return;
        !           946:     }
        !           947: 
        !           948:     /* Add an attribute with name "xml:lang" and value "de" to ORDER. */
        !           949:     rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang",
        !           950:                                      BAD_CAST "de");
        !           951:     if (rc < 0) {
        !           952:         printf
        !           953:             ("testXmlwriterTree: Error at xmlTextWriterWriteAttribute\n");
        !           954:         return;
        !           955:     }
        !           956: 
        !           957:     /* Write a comment as child of ORDER */
        !           958:     tmp = ConvertInput("<äöü>", MY_ENCODING);
        !           959:     rc = xmlTextWriterWriteFormatComment(writer,
        !           960:                         "This is another comment with special chars: %s",
        !           961:                                          tmp);
        !           962:     if (rc < 0) {
        !           963:         printf
        !           964:             ("testXmlwriterTree: Error at xmlTextWriterWriteFormatComment\n");
        !           965:         return;
        !           966:     }
        !           967:     if (tmp != NULL) xmlFree(tmp);
        !           968: 
        !           969:     /* Start an element named "HEADER" as child of ORDER. */
        !           970:     rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER");
        !           971:     if (rc < 0) {
        !           972:         printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
        !           973:         return;
        !           974:     }
        !           975: 
        !           976:     /* Write an element named "X_ORDER_ID" as child of HEADER. */
        !           977:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID",
        !           978:                                          "%010d", 53535L);
        !           979:     if (rc < 0) {
        !           980:         printf
        !           981:             ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n");
        !           982:         return;
        !           983:     }
        !           984: 
        !           985:     /* Write an element named "CUSTOMER_ID" as child of HEADER. */
        !           986:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID",
        !           987:                                          "%d", 1010);
        !           988:     if (rc < 0) {
        !           989:         printf
        !           990:             ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n");
        !           991:         return;
        !           992:     }
        !           993: 
        !           994:     /* Write an element named "NAME_1" as child of HEADER. */
        !           995:     tmp = ConvertInput("Müller", MY_ENCODING);
        !           996:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_1", tmp);
        !           997:     if (rc < 0) {
        !           998:         printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
        !           999:         return;
        !          1000:     }
        !          1001:     if (tmp != NULL) xmlFree(tmp);
        !          1002: 
        !          1003:     /* Write an element named "NAME_2" as child of HEADER. */
        !          1004:     tmp = ConvertInput("Jörg", MY_ENCODING);
        !          1005:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "NAME_2", tmp);
        !          1006:     if (rc < 0) {
        !          1007:         printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
        !          1008:         return;
        !          1009:     }
        !          1010:     if (tmp != NULL) xmlFree(tmp);
        !          1011: 
        !          1012:     /* Close the element named HEADER. */
        !          1013:     rc = xmlTextWriterEndElement(writer);
        !          1014:     if (rc < 0) {
        !          1015:         printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
        !          1016:         return;
        !          1017:     }
        !          1018: 
        !          1019:     /* Start an element named "ENTRIES" as child of ORDER. */
        !          1020:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES");
        !          1021:     if (rc < 0) {
        !          1022:         printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
        !          1023:         return;
        !          1024:     }
        !          1025: 
        !          1026:     /* Start an element named "ENTRY" as child of ENTRIES. */
        !          1027:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
        !          1028:     if (rc < 0) {
        !          1029:         printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
        !          1030:         return;
        !          1031:     }
        !          1032: 
        !          1033:     /* Write an element named "ARTICLE" as child of ENTRY. */
        !          1034:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
        !          1035:                                    BAD_CAST "<Test>");
        !          1036:     if (rc < 0) {
        !          1037:         printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
        !          1038:         return;
        !          1039:     }
        !          1040: 
        !          1041:     /* Write an element named "ENTRY_NO" as child of ENTRY. */
        !          1042:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
        !          1043:                                          10);
        !          1044:     if (rc < 0) {
        !          1045:         printf
        !          1046:             ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n");
        !          1047:         return;
        !          1048:     }
        !          1049: 
        !          1050:     /* Close the element named ENTRY. */
        !          1051:     rc = xmlTextWriterEndElement(writer);
        !          1052:     if (rc < 0) {
        !          1053:         printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
        !          1054:         return;
        !          1055:     }
        !          1056: 
        !          1057:     /* Start an element named "ENTRY" as child of ENTRIES. */
        !          1058:     rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
        !          1059:     if (rc < 0) {
        !          1060:         printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
        !          1061:         return;
        !          1062:     }
        !          1063: 
        !          1064:     /* Write an element named "ARTICLE" as child of ENTRY. */
        !          1065:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
        !          1066:                                    BAD_CAST "<Test 2>");
        !          1067:     if (rc < 0) {
        !          1068:         printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
        !          1069:         return;
        !          1070:     }
        !          1071: 
        !          1072:     /* Write an element named "ENTRY_NO" as child of ENTRY. */
        !          1073:     rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
        !          1074:                                          20);
        !          1075:     if (rc < 0) {
        !          1076:         printf
        !          1077:             ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n");
        !          1078:         return;
        !          1079:     }
        !          1080: 
        !          1081:     /* Close the element named ENTRY. */
        !          1082:     rc = xmlTextWriterEndElement(writer);
        !          1083:     if (rc < 0) {
        !          1084:         printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
        !          1085:         return;
        !          1086:     }
        !          1087: 
        !          1088:     /* Close the element named ENTRIES. */
        !          1089:     rc = xmlTextWriterEndElement(writer);
        !          1090:     if (rc < 0) {
        !          1091:         printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
        !          1092:         return;
        !          1093:     }
        !          1094: 
        !          1095:     /* Start an element named "FOOTER" as child of ORDER. */
        !          1096:     rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER");
        !          1097:     if (rc < 0) {
        !          1098:         printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
        !          1099:         return;
        !          1100:     }
        !          1101: 
        !          1102:     /* Write an element named "TEXT" as child of FOOTER. */
        !          1103:     rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT",
        !          1104:                                    BAD_CAST "This is a text.");
        !          1105:     if (rc < 0) {
        !          1106:         printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
        !          1107:         return;
        !          1108:     }
        !          1109: 
        !          1110:     /* Close the element named FOOTER. */
        !          1111:     rc = xmlTextWriterEndElement(writer);
        !          1112:     if (rc < 0) {
        !          1113:         printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
        !          1114:         return;
        !          1115:     }
        !          1116: 
        !          1117:     /* Here we could close the elements ORDER and EXAMPLE using the
        !          1118:      * function xmlTextWriterEndElement, but since we do not want to
        !          1119:      * write any other elements, we simply call xmlTextWriterEndDocument,
        !          1120:      * which will do all the work. */
        !          1121:     rc = xmlTextWriterEndDocument(writer);
        !          1122:     if (rc < 0) {
        !          1123:         printf("testXmlwriterTree: Error at xmlTextWriterEndDocument\n");
        !          1124:         return;
        !          1125:     }
        !          1126: 
        !          1127:     xmlFreeTextWriter(writer);
        !          1128: 
        !          1129:     xmlSaveFileEnc(file, doc, MY_ENCODING);
        !          1130: 
        !          1131:     xmlFreeDoc(doc);
        !          1132: }
        !          1133: 
        !          1134: /**
        !          1135:  * ConvertInput:
        !          1136:  * @in: string in a given encoding
        !          1137:  * @encoding: the encoding used
        !          1138:  *
        !          1139:  * Converts @in into UTF-8 for processing with libxml2 APIs
        !          1140:  *
        !          1141:  * Returns the converted UTF-8 string, or NULL in case of error.
        !          1142:  */
        !          1143: xmlChar *
        !          1144: ConvertInput(const char *in, const char *encoding)
        !          1145: {
        !          1146:     xmlChar *out;
        !          1147:     int ret;
        !          1148:     int size;
        !          1149:     int out_size;
        !          1150:     int temp;
        !          1151:     xmlCharEncodingHandlerPtr handler;
        !          1152: 
        !          1153:     if (in == 0)
        !          1154:         return 0;
        !          1155: 
        !          1156:     handler = xmlFindCharEncodingHandler(encoding);
        !          1157: 
        !          1158:     if (!handler) {
        !          1159:         printf("ConvertInput: no encoding handler found for '%s'\n",
        !          1160:                encoding ? encoding : "");
        !          1161:         return 0;
        !          1162:     }
        !          1163: 
        !          1164:     size = (int) strlen(in) + 1;
        !          1165:     out_size = size * 2 - 1;
        !          1166:     out = (unsigned char *) xmlMalloc((size_t) out_size);
        !          1167: 
        !          1168:     if (out != 0) {
        !          1169:         temp = size - 1;
        !          1170:         ret = handler->input(out, &out_size, (const xmlChar *) in, &temp);
        !          1171:         if ((ret < 0) || (temp - size + 1)) {
        !          1172:             if (ret < 0) {
        !          1173:                 printf("ConvertInput: conversion wasn't successful.\n");
        !          1174:             } else {
        !          1175:                 printf
        !          1176:                     ("ConvertInput: conversion wasn't successful. converted: %i octets.\n",
        !          1177:                      temp);
        !          1178:             }
        !          1179: 
        !          1180:             xmlFree(out);
        !          1181:             out = 0;
        !          1182:         } else {
        !          1183:             out = (unsigned char *) xmlRealloc(out, out_size + 1);
        !          1184:             out[out_size] = 0;  /*null terminating out */
        !          1185:         }
        !          1186:     } else {
        !          1187:         printf("ConvertInput: no mem\n");
        !          1188:     }
        !          1189: 
        !          1190:     return out;
        !          1191: }
        !          1192: 
        !          1193: #else
        !          1194: int main(void) {
        !          1195:     fprintf(stderr, "Writer or output support not compiled in\n");
        !          1196:     exit(1);
        !          1197: }
        !          1198: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>