3 #define TEXT_DTD "test2.dtd"
8 int main( int argc, char* argv[] ) {
11 char* localedir = argv[2];
13 int len = strlen(TEXT_DTD) + strlen(localedir) + 1;
18 sprintf(dtdfile, "%s/%s", localedir, TEXT_DTD );
21 if(access(dtdfile, R_OK)) {
22 fprintf(stderr, "Unable to open DTD file %s\n", dtdfile);
24 return HTTP_INTERNAL_SERVER_ERROR;
30 xmlSubstituteEntitiesDefault(0);
33 if( (doc = xmlParseFile(file)) == NULL) {
34 fprintf(stderr, "\n ^-- Error parsing XML file %s\n", file);
36 return HTTP_INTERNAL_SERVER_ERROR;
39 if( xmlXIncludeProcess(doc) < 0 ) {
40 fprintf(stderr, "\n ^-- Error processing XIncludes for file %s\n", file);
42 return HTTP_INTERNAL_SERVER_ERROR;
45 xmlReplaceDtd(doc, dtdfile);
47 doc = xmlProcessDtdEntities(doc);
49 char* xml = xmlDocToString(doc, 0);
51 printf("\n%s\n", xml);
55 xmlCleanupCharEncodingHandlers();
63 xmlDocPtr xmlProcessDtdEntities(xmlDocPtr doc) {
64 char* xml = xmlDocToString(doc, 1);
66 xmlSubstituteEntitiesDefault(1);
67 xmlDocPtr d = xmlParseMemory(xml, strlen(xml));
73 int xmlReplaceDtd(xmlDocPtr doc, char* dtdfile) {
75 if(!doc || !dtdfile) return 0;
77 /* remove the original DTD */
78 if(doc->children && doc->children->type == XML_DTD_NODE) {
79 xmlNodePtr p = doc->children;
85 xmlDtdPtr dtd = xmlParseDTD(NULL, dtdfile);
88 fprintf(stderr, "Error parsing DTD file %s\n", dtdfile);
93 fprintf(stderr, "2\n");
96 dtd->name = xmlStrdup((xmlChar*)"x");
100 xmlNodePtr x = doc->children;
101 doc->children = (xmlNodePtr)dtd;
107 char* xmlDocToString(xmlDocPtr doc, int full) {
115 xmlDocDumpMemory(doc, &xmlbuf, &size);
116 xml = strdup((char*) (xmlbuf));
122 xmlBufferPtr xmlbuf = xmlBufferCreate();
123 xmlNodeDump( xmlbuf, doc, xmlDocGetRootElement(doc), 0, 0);
124 xml = strdup((char*) (xmlBufferContent(xmlbuf)));
125 xmlBufferFree(xmlbuf);