#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[]) |
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 }