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.
10 * test: testWriter && for i in 1 2 3 4 ; do diff $(srcdir)/writer.xml writer$$i.tmp || break ; done
11 * author: Alfred Mickautsch
12 * copy: see Copyright for the status of this software.
16 #include <libxml/encoding.h>
17 #include <libxml/xmlwriter.h>
19 #if defined(LIBXML_WRITER_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
21 #define MY_ENCODING "ISO-8859-1"
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);
33 * this initialize the library and check potential ABI mismatches
34 * between the version it was compiled for and the actual shared
39 /* first, the file version */
40 testXmlwriterFilename("writer1.tmp");
42 /* next, the memory version */
43 testXmlwriterMemory("writer2.tmp");
45 /* next, the DOM version */
46 testXmlwriterDoc("writer3.tmp");
48 /* next, the tree version */
49 testXmlwriterTree("writer4.tmp");
52 * Cleanup function for the XML library.
56 * this is to debug memory for regression tests
63 * testXmlwriterFilename:
64 * @uri: the output URI
66 * test the xmlWriter interface when writing to a new file
69 testXmlwriterFilename(const char *uri)
72 xmlTextWriterPtr writer;
75 /* Create a new XmlWriter for uri, with no compression. */
76 writer = xmlNewTextWriterFilename(uri, 0);
78 printf("testXmlwriterFilename: Error creating the xml writer\n");
82 /* Start the document with the xml default for the version,
83 * encoding ISO 8859-1 and the default for the standalone
85 rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
88 ("testXmlwriterFilename: Error at xmlTextWriterStartDocument\n");
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");
97 ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
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
105 tmp = ConvertInput("This is a comment with special chars: <äöü>",
107 rc = xmlTextWriterWriteComment(writer, tmp);
110 ("testXmlwriterFilename: Error at xmlTextWriterWriteComment\n");
113 if (tmp != NULL) xmlFree(tmp);
115 /* Start an element named "ORDER" as child of EXAMPLE. */
116 rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER");
119 ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
123 /* Add an attribute with name "version" and value "1.0" to ORDER. */
124 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version",
128 ("testXmlwriterFilename: Error at xmlTextWriterWriteAttribute\n");
132 /* Add an attribute with name "xml:lang" and value "de" to ORDER. */
133 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang",
137 ("testXmlwriterFilename: Error at xmlTextWriterWriteAttribute\n");
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",
148 ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatComment\n");
151 if (tmp != NULL) xmlFree(tmp);
153 /* Start an element named "HEADER" as child of ORDER. */
154 rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER");
157 ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
161 /* Write an element named "X_ORDER_ID" as child of HEADER. */
162 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID",
166 ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
170 /* Write an element named "CUSTOMER_ID" as child of HEADER. */
171 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID",
175 ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
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);
184 ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
187 if (tmp != NULL) xmlFree(tmp);
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);
194 ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
197 if (tmp != NULL) xmlFree(tmp);
199 /* Close the element named HEADER. */
200 rc = xmlTextWriterEndElement(writer);
203 ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
207 /* Start an element named "ENTRIES" as child of ORDER. */
208 rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES");
211 ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
215 /* Start an element named "ENTRY" as child of ENTRIES. */
216 rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
219 ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
223 /* Write an element named "ARTICLE" as child of ENTRY. */
224 rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
228 ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
232 /* Write an element named "ENTRY_NO" as child of ENTRY. */
233 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
237 ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
241 /* Close the element named ENTRY. */
242 rc = xmlTextWriterEndElement(writer);
245 ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
249 /* Start an element named "ENTRY" as child of ENTRIES. */
250 rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
253 ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
257 /* Write an element named "ARTICLE" as child of ENTRY. */
258 rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
259 BAD_CAST "<Test 2>");
262 ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
266 /* Write an element named "ENTRY_NO" as child of ENTRY. */
267 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
271 ("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
275 /* Close the element named ENTRY. */
276 rc = xmlTextWriterEndElement(writer);
279 ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
283 /* Close the element named ENTRIES. */
284 rc = xmlTextWriterEndElement(writer);
287 ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
291 /* Start an element named "FOOTER" as child of ORDER. */
292 rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER");
295 ("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
299 /* Write an element named "TEXT" as child of FOOTER. */
300 rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT",
301 BAD_CAST "This is a text.");
304 ("testXmlwriterFilename: Error at xmlTextWriterWriteElement\n");
308 /* Close the element named FOOTER. */
309 rc = xmlTextWriterEndElement(writer);
312 ("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
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);
323 ("testXmlwriterFilename: Error at xmlTextWriterEndDocument\n");
327 xmlFreeTextWriter(writer);
331 * testXmlwriterMemory:
332 * @file: the output file
334 * test the xmlWriter interface when writing to memory
337 testXmlwriterMemory(const char *file)
340 xmlTextWriterPtr writer;
345 /* Create a new XML buffer, to which the XML document will be
347 buf = xmlBufferCreate();
349 printf("testXmlwriterMemory: Error creating the xml buffer\n");
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");
361 /* Start the document with the xml default for the version,
362 * encoding ISO 8859-1 and the default for the standalone
364 rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
367 ("testXmlwriterMemory: Error at xmlTextWriterStartDocument\n");
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");
376 ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
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
384 tmp = ConvertInput("This is a comment with special chars: <äöü>",
386 rc = xmlTextWriterWriteComment(writer, tmp);
389 ("testXmlwriterMemory: Error at xmlTextWriterWriteComment\n");
392 if (tmp != NULL) xmlFree(tmp);
394 /* Start an element named "ORDER" as child of EXAMPLE. */
395 rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER");
398 ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
402 /* Add an attribute with name "version" and value "1.0" to ORDER. */
403 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version",
407 ("testXmlwriterMemory: Error at xmlTextWriterWriteAttribute\n");
411 /* Add an attribute with name "xml:lang" and value "de" to ORDER. */
412 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang",
416 ("testXmlwriterMemory: Error at xmlTextWriterWriteAttribute\n");
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",
427 ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatComment\n");
430 if (tmp != NULL) xmlFree(tmp);
432 /* Start an element named "HEADER" as child of ORDER. */
433 rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER");
436 ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
440 /* Write an element named "X_ORDER_ID" as child of HEADER. */
441 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID",
445 ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n");
449 /* Write an element named "CUSTOMER_ID" as child of HEADER. */
450 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID",
454 ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n");
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);
463 ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
466 if (tmp != NULL) xmlFree(tmp);
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);
474 ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
477 if (tmp != NULL) xmlFree(tmp);
479 /* Close the element named HEADER. */
480 rc = xmlTextWriterEndElement(writer);
482 printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
486 /* Start an element named "ENTRIES" as child of ORDER. */
487 rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES");
490 ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
494 /* Start an element named "ENTRY" as child of ENTRIES. */
495 rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
498 ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
502 /* Write an element named "ARTICLE" as child of ENTRY. */
503 rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
507 ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
511 /* Write an element named "ENTRY_NO" as child of ENTRY. */
512 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
516 ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n");
520 /* Close the element named ENTRY. */
521 rc = xmlTextWriterEndElement(writer);
523 printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
527 /* Start an element named "ENTRY" as child of ENTRIES. */
528 rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
531 ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
535 /* Write an element named "ARTICLE" as child of ENTRY. */
536 rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
537 BAD_CAST "<Test 2>");
540 ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
544 /* Write an element named "ENTRY_NO" as child of ENTRY. */
545 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
549 ("testXmlwriterMemory: Error at xmlTextWriterWriteFormatElement\n");
553 /* Close the element named ENTRY. */
554 rc = xmlTextWriterEndElement(writer);
556 printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
560 /* Close the element named ENTRIES. */
561 rc = xmlTextWriterEndElement(writer);
563 printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
567 /* Start an element named "FOOTER" as child of ORDER. */
568 rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER");
571 ("testXmlwriterMemory: Error at xmlTextWriterStartElement\n");
575 /* Write an element named "TEXT" as child of FOOTER. */
576 rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT",
577 BAD_CAST "This is a text.");
580 ("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n");
584 /* Close the element named FOOTER. */
585 rc = xmlTextWriterEndElement(writer);
587 printf("testXmlwriterMemory: Error at xmlTextWriterEndElement\n");
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);
597 printf("testXmlwriterMemory: Error at xmlTextWriterEndDocument\n");
601 xmlFreeTextWriter(writer);
603 fp = fopen(file, "w");
605 printf("testXmlwriterMemory: Error at fopen\n");
609 fprintf(fp, "%s", (const char *) buf->content);
618 * @file: the output file
620 * test the xmlWriter interface when creating a new document
623 testXmlwriterDoc(const char *file)
626 xmlTextWriterPtr writer;
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");
638 /* Start the document with the xml default for the version,
639 * encoding ISO 8859-1 and the default for the standalone
641 rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
643 printf("testXmlwriterDoc: Error at xmlTextWriterStartDocument\n");
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");
651 printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
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
659 tmp = ConvertInput("This is a comment with special chars: <äöü>",
661 rc = xmlTextWriterWriteComment(writer, tmp);
663 printf("testXmlwriterDoc: Error at xmlTextWriterWriteComment\n");
666 if (tmp != NULL) xmlFree(tmp);
668 /* Start an element named "ORDER" as child of EXAMPLE. */
669 rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER");
671 printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
675 /* Add an attribute with name "version" and value "1.0" to ORDER. */
676 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version",
679 printf("testXmlwriterDoc: Error at xmlTextWriterWriteAttribute\n");
683 /* Add an attribute with name "xml:lang" and value "de" to ORDER. */
684 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang",
687 printf("testXmlwriterDoc: Error at xmlTextWriterWriteAttribute\n");
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",
698 ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatComment\n");
701 if (tmp != NULL) xmlFree(tmp);
703 /* Start an element named "HEADER" as child of ORDER. */
704 rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER");
706 printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
710 /* Write an element named "X_ORDER_ID" as child of HEADER. */
711 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID",
715 ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n");
719 /* Write an element named "CUSTOMER_ID" as child of HEADER. */
720 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID",
724 ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n");
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);
732 printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
735 if (tmp != NULL) xmlFree(tmp);
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);
741 printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
744 if (tmp != NULL) xmlFree(tmp);
746 /* Close the element named HEADER. */
747 rc = xmlTextWriterEndElement(writer);
749 printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
753 /* Start an element named "ENTRIES" as child of ORDER. */
754 rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES");
756 printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
760 /* Start an element named "ENTRY" as child of ENTRIES. */
761 rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
763 printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
767 /* Write an element named "ARTICLE" as child of ENTRY. */
768 rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
771 printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
775 /* Write an element named "ENTRY_NO" as child of ENTRY. */
776 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
780 ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n");
784 /* Close the element named ENTRY. */
785 rc = xmlTextWriterEndElement(writer);
787 printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
791 /* Start an element named "ENTRY" as child of ENTRIES. */
792 rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
794 printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
798 /* Write an element named "ARTICLE" as child of ENTRY. */
799 rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
800 BAD_CAST "<Test 2>");
802 printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
806 /* Write an element named "ENTRY_NO" as child of ENTRY. */
807 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
811 ("testXmlwriterDoc: Error at xmlTextWriterWriteFormatElement\n");
815 /* Close the element named ENTRY. */
816 rc = xmlTextWriterEndElement(writer);
818 printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
822 /* Close the element named ENTRIES. */
823 rc = xmlTextWriterEndElement(writer);
825 printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
829 /* Start an element named "FOOTER" as child of ORDER. */
830 rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER");
832 printf("testXmlwriterDoc: Error at xmlTextWriterStartElement\n");
836 /* Write an element named "TEXT" as child of FOOTER. */
837 rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT",
838 BAD_CAST "This is a text.");
840 printf("testXmlwriterDoc: Error at xmlTextWriterWriteElement\n");
844 /* Close the element named FOOTER. */
845 rc = xmlTextWriterEndElement(writer);
847 printf("testXmlwriterDoc: Error at xmlTextWriterEndElement\n");
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);
857 printf("testXmlwriterDoc: Error at xmlTextWriterEndDocument\n");
861 xmlFreeTextWriter(writer);
863 xmlSaveFileEnc(file, doc, MY_ENCODING);
870 * @file: the output file
872 * test the xmlWriter interface when writing to a subtree
875 testXmlwriterTree(const char *file)
878 xmlTextWriterPtr writer;
883 /* Create a new XML DOM tree, to which the XML document will be
885 doc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION);
888 ("testXmlwriterTree: Error creating the xml document tree\n");
892 /* Create a new XML node, to which the XML document will be
894 node = xmlNewDocNode(doc, NULL, BAD_CAST "EXAMPLE", NULL);
896 printf("testXmlwriterTree: Error creating the xml node\n");
900 /* Make ELEMENT the root node of the tree */
901 xmlDocSetRootElement(doc, node);
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");
910 /* Start the document with the xml default for the version,
911 * encoding ISO 8859-1 and the default for the standalone
913 rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);
915 printf("testXmlwriterTree: Error at xmlTextWriterStartDocument\n");
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
923 tmp = ConvertInput("This is a comment with special chars: <äöü>",
925 rc = xmlTextWriterWriteComment(writer, tmp);
927 printf("testXmlwriterTree: Error at xmlTextWriterWriteComment\n");
930 if (tmp != NULL) xmlFree(tmp);
932 /* Start an element named "ORDER" as child of EXAMPLE. */
933 rc = xmlTextWriterStartElement(writer, BAD_CAST "ORDER");
935 printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
939 /* Add an attribute with name "version" and value "1.0" to ORDER. */
940 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "version",
944 ("testXmlwriterTree: Error at xmlTextWriterWriteAttribute\n");
948 /* Add an attribute with name "xml:lang" and value "de" to ORDER. */
949 rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang",
953 ("testXmlwriterTree: Error at xmlTextWriterWriteAttribute\n");
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",
964 ("testXmlwriterTree: Error at xmlTextWriterWriteFormatComment\n");
967 if (tmp != NULL) xmlFree(tmp);
969 /* Start an element named "HEADER" as child of ORDER. */
970 rc = xmlTextWriterStartElement(writer, BAD_CAST "HEADER");
972 printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
976 /* Write an element named "X_ORDER_ID" as child of HEADER. */
977 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "X_ORDER_ID",
981 ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n");
985 /* Write an element named "CUSTOMER_ID" as child of HEADER. */
986 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CUSTOMER_ID",
990 ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n");
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);
998 printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
1001 if (tmp != NULL) xmlFree(tmp);
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);
1007 printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
1010 if (tmp != NULL) xmlFree(tmp);
1012 /* Close the element named HEADER. */
1013 rc = xmlTextWriterEndElement(writer);
1015 printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
1019 /* Start an element named "ENTRIES" as child of ORDER. */
1020 rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRIES");
1022 printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
1026 /* Start an element named "ENTRY" as child of ENTRIES. */
1027 rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
1029 printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
1033 /* Write an element named "ARTICLE" as child of ENTRY. */
1034 rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
1037 printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
1041 /* Write an element named "ENTRY_NO" as child of ENTRY. */
1042 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
1046 ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n");
1050 /* Close the element named ENTRY. */
1051 rc = xmlTextWriterEndElement(writer);
1053 printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
1057 /* Start an element named "ENTRY" as child of ENTRIES. */
1058 rc = xmlTextWriterStartElement(writer, BAD_CAST "ENTRY");
1060 printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
1064 /* Write an element named "ARTICLE" as child of ENTRY. */
1065 rc = xmlTextWriterWriteElement(writer, BAD_CAST "ARTICLE",
1066 BAD_CAST "<Test 2>");
1068 printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
1072 /* Write an element named "ENTRY_NO" as child of ENTRY. */
1073 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ENTRY_NO", "%d",
1077 ("testXmlwriterTree: Error at xmlTextWriterWriteFormatElement\n");
1081 /* Close the element named ENTRY. */
1082 rc = xmlTextWriterEndElement(writer);
1084 printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
1088 /* Close the element named ENTRIES. */
1089 rc = xmlTextWriterEndElement(writer);
1091 printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
1095 /* Start an element named "FOOTER" as child of ORDER. */
1096 rc = xmlTextWriterStartElement(writer, BAD_CAST "FOOTER");
1098 printf("testXmlwriterTree: Error at xmlTextWriterStartElement\n");
1102 /* Write an element named "TEXT" as child of FOOTER. */
1103 rc = xmlTextWriterWriteElement(writer, BAD_CAST "TEXT",
1104 BAD_CAST "This is a text.");
1106 printf("testXmlwriterTree: Error at xmlTextWriterWriteElement\n");
1110 /* Close the element named FOOTER. */
1111 rc = xmlTextWriterEndElement(writer);
1113 printf("testXmlwriterTree: Error at xmlTextWriterEndElement\n");
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);
1123 printf("testXmlwriterTree: Error at xmlTextWriterEndDocument\n");
1127 xmlFreeTextWriter(writer);
1129 xmlSaveFileEnc(file, doc, MY_ENCODING);
1136 * @in: string in a given encoding
1137 * @encoding: the encoding used
1139 * Converts @in into UTF-8 for processing with libxml2 APIs
1141 * Returns the converted UTF-8 string, or NULL in case of error.
1144 ConvertInput(const char *in, const char *encoding)
1151 xmlCharEncodingHandlerPtr handler;
1156 handler = xmlFindCharEncodingHandler(encoding);
1159 printf("ConvertInput: no encoding handler found for '%s'\n",
1160 encoding ? encoding : "");
1164 size = (int) strlen(in) + 1;
1165 out_size = size * 2 - 1;
1166 out = (unsigned char *) xmlMalloc((size_t) out_size);
1170 ret = handler->input(out, &out_size, (const xmlChar *) in, &temp);
1171 if ((ret < 0) || (temp - size + 1)) {
1173 printf("ConvertInput: conversion wasn't successful.\n");
1176 ("ConvertInput: conversion wasn't successful. converted: %i octets.\n",
1183 out = (unsigned char *) xmlRealloc(out, out_size + 1);
1184 out[out_size] = 0; /*null terminating out */
1187 printf("ConvertInput: no mem\n");
1195 fprintf(stderr, "Writer or output support not compiled in\n");