#!/bin/ch /* Copyright (c) Oracle Corporation 1999, 2000, 2001. All Rights Reserved. */ /* NAME FullDOM.c DESCRIPTION Sample code to test full DOM interface */ #include "xdkkit.h" #include #ifndef ORATYPES # include #endif #ifndef ORAXML_ORACLE # include #endif #define TEST_DOCUMENT (oratext *) "c:/Inetpub/wwwroot/chxml/demos/xdk/FullDOM.xml" void dump(xmlnode *node, uword level); void dumpnode(xmlnode *node, uword level); static char *ntypename[] = { "0", "ELEMENT", "ATTRIBUTE", "TEXT", "CDATA", "ENTREF", "ENTITY", "PI", "COMMENT", "DOCUMENT", "DTD", "DOCFRAG", "NOTATION" }; #define FAIL { puts("Failed!"); exit(1); } int main() { Response.setContentType(contenttype); Response.begin(); //Response.title(title); xmlctx *ctx; xmlnode *doc, *elem, *node, *text, *pi, *comment, *entref, *subelem, *subtext, *cdata, *attr1, *attr2, *clone, *deep_clone, *frag, *fragelem, *fragtext, *sub2, *fish, *food, *gleep1, *gleep2, *repl, *dtd; xmlnodes *subs, *nodes, *attrs, *notes, *entities; uword i, ecode, level; puts("XML C Full DOM test"); puts("Initializing XML parser..."); if (!(ctx = xmlinit(&ecode, (const oratext *) 0, (void (*)(void *, const oratext *, uword)) 0, (void *) 0, (const xmlsaxcb *) 0, (void *) 0, (const xmlmemcb *) 0, (void *) 0, (const oratext *) 0))) { printf("Failed to initialze XML parser, error %u\n", (unsigned) ecode); return 1; } puts("\nCreating new document..."); if (!(doc = createDocument(ctx))) FAIL puts("Document from root node:"); dump(getDocument(ctx), 0); puts("\nCreating 'ROOT' element..."); if (!(elem = createElement(ctx, (oratext *) "ROOT"))) FAIL puts("Setting as 'ROOT' element..."); if (!appendChild(ctx, doc, elem)) FAIL puts("Document from 'ROOT' element:"); dump(getDocumentElement(ctx), 0); puts("Adding 7 children to 'ROOT' element..."); if (!(text = createTextNode(ctx, (oratext *) "Gibberish")) || !appendChild(ctx, elem, text)) FAIL if (!(comment = createComment(ctx, (oratext*) "Bit warm today, innit?")) || !appendChild(ctx, elem, comment)) FAIL if (!(pi = createProcessingInstruction(ctx, (oratext *) "target", (oratext *) "PI-contents")) || !appendChild(ctx, elem, pi)) FAIL if (!(cdata = createCDATASection(ctx, (oratext *) "See DATA")) || !appendChild(ctx, elem, cdata)) FAIL if (!(entref = createEntityReference(ctx, (oratext *) "EntRef")) || !appendChild(ctx, elem, entref)) FAIL if (!(fish = createElement(ctx, (oratext *) "FISH")) || !appendChild(ctx, elem, fish)) FAIL if (!(food = createElement(ctx, (oratext *) "FOOD")) || !appendChild(ctx, elem, food)) FAIL puts("Document from 'ROOT' element with its 7 children:"); dump(getDocumentElement(ctx), 0); puts("\nTesting node insertion..."); puts("Adding 'Pre-Gibberish' text node and 'Ask about the weather' comment node ..."); if (!(node = createTextNode(ctx, (oratext *) "Pre-Gibberish")) || !insertBefore(ctx, elem, node, text)) FAIL if (!(node = createComment(ctx, (oratext *) "Ask about the weather:")) || !insertBefore(ctx, elem, node, comment)) FAIL puts("Document from 'ROOT' element:"); dump(getDocumentElement(ctx), 0); puts("\nTesting node removal by name ..."); puts("Removing 'FISH' element"); if (!(nodes = getChildNodes(elem)) || !removeNamedItem(nodes, (oratext *) "FISH")) FAIL puts("Document from 'ROOT' element:"); dump(getDocumentElement(ctx), 0); puts("\nTesting nextSibling links starting at first child..."); for (node = getFirstChild(elem); node; node = getNextSibling(node)) dump(node, 1); puts("\nTesting previousSibling links starting at last child..."); for (node = getLastChild(elem); node; node = getPreviousSibling(node)) dump(node, 1); puts("\nTesting setting node value..."); puts("Original node:"); dump(pi, 1); setNodeValue(pi, (oratext *) "New PI contents"); puts("Node after new value:"); dump(pi, 1); puts("\nAdding another element level, i.e., 'SUB' ..."); if (!(subelem = createElement(ctx, (oratext *) "SUB")) || !insertBefore(ctx, elem, subelem, cdata) || !(subtext = createTextNode(ctx, (oratext *) "Lengthy SubText")) || !appendChild(ctx, subelem, subtext)) FAIL puts("Document from 'ROOT' element:"); dump(getDocumentElement(ctx), 0); puts("\nAdding a second 'SUB' element..."); if (!(sub2 = createElement(ctx, (oratext *) "SUB")) || !insertBefore(ctx, elem, sub2, cdata)) FAIL puts("Document from 'ROOT' element:"); dump(getDocumentElement(ctx), 0); puts("\nGetting all SUB nodes - note the distinct hex addresses ..."); if (!(subs = getElementsByTagName(ctx, (xmlnode *) 0, (oratext *) "SUB"))) FAIL for (i = 0; i < getNodeMapLength(subs); i++) dumpnode(getChildNode(subs, i), 1); puts("\nTesting parent links..."); for (level = 1, node = subtext; node; node = getParentNode(node), level++) dumpnode(node, level); puts("\nTesting owner document of node..."); dumpnode(subtext, 1); dumpnode(getOwnerDocument(subtext), 1); puts("\nTesting node replacement..."); if (!(node = createTextNode(ctx, (oratext *) "REPLACEMENT, 1/2 PRICE")) || !replaceChild(ctx, pi, node)) FAIL puts("Document from 'ROOT' element:"); dump(getDocumentElement(ctx), 0); puts("\nTesting node removal..."); if (!removeChild(entref)) FAIL puts("Document from 'ROOT' element:"); dump(getDocumentElement(ctx), 0); puts("\nNormalizing..."); normalize(ctx, elem); puts("Document from 'ROOT' element:"); dump(getDocumentElement(ctx), 0); puts("\nCreating and populating document fragment..."); if (!(frag = createDocumentFragment(ctx)) || !(fragelem = createElement(ctx, (oratext *) "FragElem")) || !(fragtext = createTextNode(ctx, (oratext *) "FragText")) || !appendChild(ctx, frag, fragelem) || !appendChild(ctx, frag, fragtext)) FAIL dump(frag, 1); puts("Insert document fragment..."); if (!insertBefore(ctx, elem, frag, comment)) FAIL dump(elem, 1); puts("\nCreate two attributes..."); if (!(attr1 = createAttribute(ctx,(oratext*)"Attr1",(oratext*)"Value1")) || !(attr2 = createAttribute(ctx,(oratext*)"Attr2",(oratext*)"Value2"))) FAIL puts("Setting attributes..."); if (!setAttributeNode(ctx, subelem, attr1, NULL) || !setAttributeNode(ctx, subelem, attr2, NULL)) FAIL dump(subelem, 1); puts("\nAltering attribute1 value..."); setAttrValue(attr1, (oratext *) "New1"); dump(subelem, 1); puts("\nFetching attribute by name (Attr2)..."); if (!(node = getAttributeNode(subelem, (oratext *) "Attr2"))) FAIL dump(node, 1); puts("\nRemoving attribute by name (Attr1)..."); removeAttribute(subelem, (oratext *) "Attr1"); dump(subelem, 1); puts("\nAdding new attribute..."); if (!setAttribute(ctx, subelem, (oratext *) "Attr3", (oratext *) "Value3")) FAIL dump(subelem, 1); puts("\nRemoving attribute by pointer (Attr2)..."); if (!removeAttributeNode(subelem, attr2)) FAIL dump(subelem, 1); puts("\nAdding new attribute w/same name (test replacement)..."); dump(subelem, 1); if (!(node = createAttribute(ctx, (oratext*)"Attr3", (oratext*)"Zoo3"))) FAIL if (!setAttributeNode(ctx, subelem, node, NULL)) FAIL dump(subelem, 1); puts("\nTesting node (attr) set by name ..."); puts("Adding 'GLEEP' attribute and printing out hex addresses of node set"); attrs = getAttributes(subelem); if (!(gleep1=createAttribute(ctx,(oratext*)"GLEEP",(oratext*)"gleep1")) || !setNamedItem(ctx, attrs, gleep1, NULL)) FAIL dump(subelem, 1); puts("\nTesting node set by name ..."); puts("Replacing 'GLEEP' attribute - note the changed hex address"); if (!(gleep2=createAttribute(ctx,(oratext*)"GLEEP",(oratext*)"gleep2")) || !setNamedItem(ctx, attrs, gleep2, &repl)) FAIL dump(subelem, 1); puts("Replaced node was:"); dump(repl, 1); puts("\nOriginal SubROOT..."); dump(subelem, 1); puts("Cloned SubROOT (not deep)..."); clone = cloneNode(ctx, subelem, FALSE); dump(clone, 1); puts("Cloned SubROOT (deep)..."); deep_clone = cloneNode(ctx, subelem, TRUE); dump(deep_clone, 1); puts("\nSplitting text..."); dump(subelem, 1); splitText(ctx, subtext, 3); dump(subelem, 1); puts("\nTesting string operations..."); printf(" CharData = \"%s\"\n", getCharData(subtext)); puts("Setting new data..."); setCharData(subtext, (oratext *) "0123456789"); printf(" CharData = \"%s\"\n", getCharData(subtext)); printf(" CharLength = %d\n", getCharLength(subtext)); printf(" Substring(0,5) = \"%s\"\n", substringData(ctx, subtext, 0, 5)); printf(" Substring(8,2) = \"%s\"\n", substringData(ctx, subtext, 8, 2)); puts("Appending data..."); appendData(ctx, subtext, (oratext *) "ABCDEF"); printf(" CharData = \"%s\"\n", getCharData(subtext)); puts("Inserting data..."); insertData(ctx, subtext, 10, (oratext *) "*foo*"); printf(" CharData = \"%s\"\n", getCharData(subtext)); puts("Deleting data..."); deleteData(ctx, subtext, 0, 10); printf(" CharData = \"%s\"\n", getCharData(subtext)); puts("Replacing data..."); replaceData(ctx, subtext, 1, 3, (oratext *) "bamboozle"); printf(" CharData = \"%s\"\n", getCharData(subtext)); puts("Cleaning up..."); xmlclean(ctx); if (getDocument(ctx)) { puts("Problem, document is not gone!!"); return 1; } puts("Parsing test document..."); if (ecode = xmlparse(ctx, TEST_DOCUMENT, (oratext *) 0, 0)) { printf("Parse failed, code %d\n", (int) ecode); return 1; } puts("Document from root node:"); dump(getDocument(ctx), 0); dtd = getDocType(ctx); puts("Testing getDocTypeNotations..."); if (notes = getDocTypeNotations(dtd)) { size_t n_notes = numChildNodes(notes); printf("# of notations = %d\n", (int) n_notes); for (i = 0; i < n_notes; i++) dump(getChildNode(notes, i), 1); } else puts("No defined notations\n"); puts("Testing getDocTypeEntities..."); if (entities = getDocTypeEntities(dtd)) { size_t n_entities = numChildNodes(entities); printf("# of entities = %d\n", (int) n_entities); for (i = 0; i < n_entities; i++) dump(getChildNode(entities, i), 1); } else puts("No defined entities\n"); puts("Cleaning up..."); xmlclean(ctx); if (getDocument(ctx)) { puts("Problem, document is not gone!!\n"); return 1; } puts("\nTerminating parser..."); xmlterm(ctx); puts("Success."); Response.end(); return 0; } void dump(xmlnode *node, uword level) { xmlnodes *nodes; uword i, n_nodes; if (node) { dumpnode(node, level); if ((getNodeType(node) != DOCUMENT_TYPE_NODE) && hasChildNodes(node)) { nodes = getChildNodes(node); n_nodes = numChildNodes(nodes); for (i = 0; i < n_nodes; i++) dump(getChildNode(nodes, i), level + 1); } } } void dumpnode(xmlnode *node, uword level) { const oratext *name, *value; xmlntype type; xmlnodes *attrs; xmlnode *attr; uword i, n_attrs; if (node) { for (i = 0; i <= level; i++) fputs(" ", stdout); type = getNodeType(node); fputs(ntypename[type], stdout); if ((name = getNodeName(node)) && (*name != '#')) printf(" \"%s\"", (char *) name); if (value = getNodeValue(node)) printf(" = \"%s\"", (char *) value); if ((type == ELEMENT_NODE) && (attrs = getAttributes(node))) { fputs(" [", stdout); n_attrs = numAttributes(attrs); for (i = 0; i < n_attrs; i++) { if (i) fputs(", ", stdout); attr = getAttributeIndex(attrs, i); fputs((char *) getAttrName(attr), stdout); if (getAttrSpecified(attr)) putchar('*'); printf("=\"%s\"", (char *) getAttrValue(attr)); } putchar(']'); } putchar('\n'); } } /* end of FullDOM.c */