gareth 2003/03/19 07:10:56 Modified: c/samples/DOMCount DOMCount.cpp Log: Added flag (p) and code to the countChildElements fn to enable printing of nodes and all associated attributes. This project looks like a good place for this feature as it is already walking through all the nodes of the tree. -Vinayak, 2003/03/06 Revision Changes Path 1.37 +45 -5 xml-xerces/c/samples/DOMCount/DOMCount.cpp Index: DOMCount.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/samples/DOMCount/DOMCount.cpp,v retrieving revision 1.36 retrieving revision 1.37 diff -u -r1.36 -r1.37 --- DOMCount.cpp 14 Mar 2003 13:03:10 -0000 1.36 +++ DOMCount.cpp 19 Mar 2003 15:10:56 -0000 1.37 @@ -72,6 +72,8 @@ #include <xercesc/dom/DOMNodeList.hpp> #include <xercesc/dom/DOMError.hpp> #include <xercesc/dom/DOMLocator.hpp> +#include <xercesc/dom/DOMNamedNodeMap.hpp> +#include <xercesc/dom/DOMAttr.hpp> #include "DOMCount.hpp" #include <string.h> #include <stdlib.h> @@ -97,6 +99,7 @@ " -s Enable schema processing. Defaults to off.\n" " -f Enable full schema constraint checking. Defaults to off.\n" " -locale=ll_CC specify the locale, default: en_US.\n" + " -p Print out names of elements and attributes encountered.\n" " -? Show this help.\n\n" " * = Default if not provided explicitly.\n" << endl; @@ -107,17 +110,48 @@ // --------------------------------------------------------------------------- // // Recursively Count up the total number of child Elements under the specified Node. +// Process attributes of the node, if any. // // --------------------------------------------------------------------------- -static int countChildElements(DOMNode *n) +static int countChildElements(DOMNode *n, bool printOutEncounteredEles) { DOMNode *child; int count = 0; if (n) { if (n->getNodeType() == DOMNode::ELEMENT_NODE) - count++; + { + if(printOutEncounteredEles) { + char *name = XMLString::transcode(n->getNodeName()); + cout <<"----------------------------------------------------------"<<endl; + cout <<"Encountered Element : "<< name << endl; + + XMLString::release(&name); + + if(n->hasAttributes()) { + // get all the attributes of the node + DOMNamedNodeMap *pAttributes = n->getAttributes(); + int nSize = pAttributes->getLength(); + cout <<"\tAttributes" << endl; + cout <<"\t----------" << endl; + for(int i=0;i<nSize;++i) { + DOMAttr *pAttributeNode = (DOMAttr*) pAttributes->item(i); + // get attribute name + char *name = XMLString::transcode(pAttributeNode->getName()); + + cout << "\t" << name << "="; + XMLString::release(&name); + + // get attribute type + name = XMLString::transcode(pAttributeNode->getValue()); + cout << name << endl; + XMLString::release(&name); + } + } + } + ++count; + } for (child = n->getFirstChild(); child != 0; child=child->getNextSibling()) - count += countChildElements(child); + count += countChildElements(child, printOutEncounteredEles); } return count; } @@ -145,6 +179,7 @@ bool doList = false; bool errorOccurred = false; bool recognizeNEL = false; + bool printOutEncounteredEles = false; char localeStr[64]; memset(localeStr, 0, sizeof localeStr); @@ -207,6 +242,11 @@ recognizeNEL = true; } + else if (!strcmp(argV[argInd], "-p") + || !strcmp(argV[argInd], "-P")) + { + printOutEncounteredEles = true; + } else if (!strncmp(argV[argInd], "-locale=", 8)) { // Get out the end of line @@ -383,7 +423,7 @@ { unsigned int elementCount = 0; if (doc) { - elementCount = countChildElements((DOMNode*)doc->getDocumentElement()); + elementCount = countChildElements((DOMNode*)doc->getDocumentElement(), printOutEncounteredEles); // test getElementsByTagName and getLength XMLCh xa[] = {chAsterisk, chNull}; if (elementCount != doc->getElementsByTagName(xa)->getLength()) {
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]