/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Calibration/xmlBase/xmlBase-00-00-03/src/test/entity_test.cxx File Reference

#include <xercesc/dom/DOM.hpp>
#include <xercesc/framework/LocalFileInputSource.hpp>
#include <xercesc/framework/MemBufInputSource.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/XMLUni.hpp>
#include <xercesc/sax/ErrorHandler.hpp>
#include <xercesc/sax/SAXParseException.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <string>
#include <iostream>

Go to the source code of this file.

Classes

class  XmlErrorHandler

Functions

void Process (DOMDocument *doc, char *eltName)
int main (int argc, char *argv[])


Function Documentation

int main ( int  argc,
char *  argv[] 
)

Definition at line 42 of file entity_test.cxx.

References Process(), release, and deljobs::string.

00042                                  {
00043   
00044   std::string infile;
00045   if (argc < 2) { 
00046     infile=std::string("/u/ey/jrb/dev500/vanilla/xmlBase/v5r1/xml/simpleDoc.xml");
00047   }
00048   else {
00049     infile = std::string(argv[1]);
00050   }
00051 
00052   try {
00053     XMLPlatformUtils::Initialize();
00054   }
00055   catch(const XMLException& toCatch)
00056   {  // may want to redirect in Gaudi environment
00057     char*  charMsg = XMLString::transcode(toCatch.getMessage());
00058     std::string msg = std::string(charMsg);
00059     XMLString::release(&charMsg);
00060     //        std::string msg(Dom::transToChar(toCatch.getMessage()));
00061     std::cerr << "Error during Xerces-c Initialization.\n"
00062               << "  Exception message:" << msg << std::endl;
00063     return 0;
00064   }
00065 
00066   const char* inChars = infile.c_str();
00067   XMLCh* xmlchPath = XMLString::transcode(inChars);
00068   XercesDOMParser* parser = new XercesDOMParser();
00069 
00070   XmlErrorHandler* errorHandler = new XmlErrorHandler();
00071   parser->setErrorHandler(errorHandler);
00072 
00073   // The following made no difference in the output
00074   //  parser->useScanner(XMLUni::fgDGXMLScanner);
00075   // According to documentation we shouldn't need this, but
00076   // can't hurt
00077   parser->setValidationScheme(AbstractDOMParser::Val_Auto);
00078   
00079 
00080   std::cout << "create entity reference flag has default (true) value" << 
00081     std::endl;
00082   parser->parse(xmlchPath);
00083   DOMDocument* doc = parser->getDocument();
00084   std::cout << "Document successfully parsed" << std::endl;
00085   std::cout << "processing local elements.. " << std::endl;
00086   Process(doc, "const");
00087   std::cout << std::endl << "processing external elements.. " << std::endl;
00088   Process(doc, "extConst");
00089 
00090   parser->reset();
00091   parser->setCreateEntityReferenceNodes(false);
00092 
00093   std::cout << std::endl << std::endl \
00094             << "create entity reference flag has value false" << std::endl;
00095   parser->parse(xmlchPath);
00096   DOMDocument* expandDoc = parser->getDocument();
00097   std::cout << "Document successfully parsed" << std::endl;
00098   std::cout << "processing local elements.. " << std::endl;
00099   Process(expandDoc, "const");
00100   std::cout << "processing external elements.. " << std::endl;
00101   Process(expandDoc, "extConst");
00102 
00103 }

void Process ( DOMDocument *  doc,
char *  eltName 
)

Definition at line 105 of file entity_test.cxx.

References release.

Referenced by main().

00105                                               {
00106   XMLCh* xmlchEltName = XMLString::transcode(eltName);
00107   XMLCh* xmlchName = XMLString::transcode("name");
00108   XMLCh* xmlchValue = XMLString::transcode("value");
00109   XMLCh* xmlchModified = XMLString::transcode("modified");
00110   if (!doc) {
00111     std::cerr << "invalid document " << std::endl;
00112     return;
00113   }
00114 
00115   // Find all elements with supplied tag name
00116   DOMNodeList* constList = doc->getElementsByTagName(xmlchEltName);
00117   unsigned int nElt = constList->getLength();
00118   for (unsigned int iElt = 0; iElt < nElt; iElt++) {
00119     try {  
00120       bool mismatch = false;
00121       DOMNode* item = constList->item(iElt);
00122       DOMElement* itemElt = dynamic_cast<DOMElement *>(item);
00123       DOMElement* byIdElt;
00124       std::cout << std::endl << eltName << " #" << iElt 
00125                 << " Address as node:  " 
00126                 << item << " and as element: " << itemElt << std::endl;
00127       const XMLCh* xmlchNamevalue = itemElt->getAttribute(xmlchName);
00128       if (XMLString::stringLen(xmlchNamevalue) > 0 ) {
00129         char* namevalue = XMLString::transcode(xmlchNamevalue);
00130         std::cout << "element has name " << namevalue << std::endl;
00131         byIdElt = doc->getElementById(xmlchNamevalue);
00132         std::cout << "Address from getElementById: " << byIdElt << std::endl;
00133         if (byIdElt != itemElt) {
00134           mismatch = true;
00135           std::cout << "**** Address mismatch " << std::endl << std::endl;
00136         }
00137         XMLString::release(&namevalue);
00138       }
00139       std::cout << "Modifying value attribute using DOM_Element address" << std::endl;
00140       itemElt->setAttribute(xmlchValue, xmlchModified);
00141       if (mismatch) {
00142         std::cout << "Modifying value attribute using looked-up address" 
00143                   << std::endl;
00144         byIdElt->setAttribute(xmlchValue, xmlchModified);
00145 
00146       }
00147     }
00148     catch (DOMException ex) {
00149       int code = ex.code;
00150       std::cout << "***** Processing failed for element #" << iElt 
00151                 << " with DOMException, code = " 
00152                 << code << std::endl << std::endl;
00153     }
00154   }
00155   
00156 }


Generated on Tue Nov 29 23:14:53 2016 for BOSS_7.0.2 by  doxygen 1.4.7