Annotation of embedaddon/libxml2/doc/examples/testWriter.c, revision 1.1.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>