]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/apachemods/xmltools.c
dev.gapines
[Evergreen.git] / Open-ILS / src / apachemods / xmltools.c
1 #include "xmltools.h"
2
3
4 #ifdef XMLTOOLS_DEBUG // standalone debugging 
5
6 int main(int argc, char* argv[]) {
7
8         char* file = argv[1];
9         char* dtdfile = argv[2];
10
11
12         printf("\n%s\n", xmlDocToString(xmlParseEntity(file), 1));
13
14         xmlDocPtr doc;
15
16         xmlSubstituteEntitiesDefault(1);
17         xmlParserCtxtPtr ctxt = xmlNewParserCtxt();
18         doc = xmlCtxtReadFile(ctxt, file, NULL, XML_PARSE_NOENT | XML_PARSE_RECOVER | XML_PARSE_NOERROR | XML_PARSE_NOWARNING );
19         if(doc != NULL) 
20                 fprintf(stderr, "What we have so far:\n%s\n", xmlDocToString(doc, 1));
21         else {
22                 fprintf(stderr, "NO Doc\n");
23                 return 0;
24         }
25
26         /* parse the doc */
27         /*
28         if( (doc = xmlParseFile(file)) == NULL) {
29                 fprintf(stderr, "\n ^-- Error parsing XML file %s\n", file);
30                 fflush(stderr);
31                 return 99;
32         }
33         */
34
35         /* process xincludes */
36         if( xmlXIncludeProcessFlags(doc, XML_PARSE_NOENT) < 0 ) {
37                 fprintf(stderr, "\n ^-- Error processing XIncludes for file %s\n", file);
38                 if(doc != NULL) 
39                         fprintf(stderr, "What we have so far:\n%s\n", xmlDocToString(doc, 1));
40                 fflush(stderr);
41                 return 99;
42         }
43
44
45
46         /* replace the DTD */
47         /*
48         if(xmlReplaceDtd(doc, dtdfile) < 0) {
49                 fprintf(stderr, "Error replacing DTD file with file %s\n", dtdfile);
50                 fflush(stderr);
51                 return 99;
52         }
53         */
54
55         //
56         xmlAddDocEntity(doc, "test", XML_INTERNAL_GENERAL_ENTITY, NULL, NULL, "Here is my test");
57
58         xmlSubstituteEntitiesDefault(1);
59         printf("---------------------------------\n%s\n", xmlDocToString(doc,1));
60         exit(99);
61         //
62
63         /* force DTD entity replacement */
64         doc = xmlProcessDtdEntities(doc);
65
66         /* stringify */
67         char* xml = xmlDocToString(doc, 0);
68
69         fprintf(stderr, "%s\n", xml);
70
71         /* deallocate */
72         free(xml);
73         xmlFreeDoc(doc);
74         xmlCleanupCharEncodingHandlers();
75         xmlCleanupParser();
76
77
78 }
79
80 #endif
81
82 xmlDocPtr xmlProcessDtdEntities(xmlDocPtr doc) {
83         char* xml = xmlDocToString(doc, 1);
84         xmlFreeDoc(doc);
85         xmlSubstituteEntitiesDefault(1);
86         xmlDocPtr d = xmlParseMemory(xml, strlen(xml));
87         free(xml);
88         return d;
89 }
90
91
92 int xmlReplaceDtd(xmlDocPtr doc, char* dtdfile) {
93
94         if(!doc || !dtdfile) return 0;
95
96         /* remove the original DTD */
97         if(doc->children && doc->children->type ==  XML_DTD_NODE) {
98                 xmlNodePtr p = doc->children;
99                 xmlUnlinkNode(p);
100                 xmlFreeNode(p);
101         }
102
103
104         xmlDtdPtr dtd = xmlParseDTD(NULL, dtdfile);
105
106         if(!dtd) {
107                 fprintf(stderr, "Error parsing DTD file %s\n", dtdfile);
108                 fflush(stderr);
109                 return -1;
110         }
111
112         dtd->name = xmlStrdup((xmlChar*)"x");
113         doc->extSubset = dtd;   
114         dtd->doc = doc;
115         dtd->parent = doc;
116         xmlNodePtr x = doc->children;
117         doc->children = (xmlNodePtr)dtd;
118         dtd->next = x;
119
120         return 1;
121 }
122
123 char* xmlDocToString(xmlDocPtr doc, int full) {
124
125         if(!doc) return NULL;
126
127         char* xml;
128
129         if(full) {
130
131                 xmlChar* xmlbuf;
132                 int size;
133                 xmlDocDumpMemory(doc, &xmlbuf, &size);
134                 xml = strdup((char*) (xmlbuf));
135                 xmlFree(xmlbuf);
136                 return xml;
137
138         } else {
139
140                 xmlBufferPtr xmlbuf = xmlBufferCreate();
141                 xmlNodeDump( xmlbuf, doc, xmlDocGetRootElement(doc), 0, 0);
142                 xml = strdup((char*) (xmlBufferContent(xmlbuf)));
143                 xmlBufferFree(xmlbuf);
144                 return xml;
145
146         }
147 }
148
149