BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
entity_test.cxx
Go to the documentation of this file.
1// Compare handling of elements in the physical file passed to parser
2// versus those coming from a separate file, included via entity reference
3
4#include <xercesc/dom/DOM.hpp>
5#include <xercesc/framework/LocalFileInputSource.hpp>
6#include <xercesc/framework/MemBufInputSource.hpp>
7#include <xercesc/parsers/XercesDOMParser.hpp>
8#include <xercesc/sax/ErrorHandler.hpp>
9#include <xercesc/sax/SAXParseException.hpp>
10#include <xercesc/util/PlatformUtils.hpp>
11#include <xercesc/util/XMLString.hpp>
12#include <xercesc/util/XMLUni.hpp>
13
14#include <iostream>
15#include <string>
16
17XERCES_CPP_NAMESPACE_USE
18class XmlErrorHandler : public ErrorHandler {
19public:
20 XmlErrorHandler( std::ostream& errOut = std::cerr ) : m_errOut( errOut ) { resetErrors(); }
22 void warning( const SAXParseException& exception );
23 void error( const SAXParseException& exception );
24 void fatalError( const SAXParseException& exception );
25 void resetErrors();
26
27 int getWarningCount() const { return m_nWarning; }
28 int getErrorCount() const { return m_nError; }
29 int getFatalCount() const { return m_nFatal; }
30
31private:
32 int m_nWarning, m_nError, m_nFatal;
33 std::ostream& m_errOut;
34}; // end class definition
35
36// forward declaration
37void Process( DOMDocument* doc, char* eltName );
38
39// Start here
40int main( int argc, char* argv[] ) {
41
42 std::string infile;
43 if ( argc < 2 )
44 { infile = std::string( "/u/ey/jrb/dev500/vanilla/xmlBase/v5r1/xml/simpleDoc.xml" ); }
45 else { infile = std::string( argv[1] ); }
46
47 try
48 { XMLPlatformUtils::Initialize(); } catch ( const XMLException& toCatch )
49 { // may want to redirect in Gaudi environment
50 char* charMsg = XMLString::transcode( toCatch.getMessage() );
51 std::string msg = std::string( charMsg );
52 XMLString::release( &charMsg );
53 // std::string msg(Dom::transToChar(toCatch.getMessage()));
54 std::cerr << "Error during Xerces-c Initialization.\n"
55 << " Exception message:" << msg << std::endl;
56 return 0;
57 }
58
59 const char* inChars = infile.c_str();
60 XMLCh* xmlchPath = XMLString::transcode( inChars );
61 XercesDOMParser* parser = new XercesDOMParser();
62
63 XmlErrorHandler* errorHandler = new XmlErrorHandler();
64 parser->setErrorHandler( errorHandler );
65
66 // The following made no difference in the output
67 // parser->useScanner(XMLUni::fgDGXMLScanner);
68 // According to documentation we shouldn't need this, but
69 // can't hurt
70 parser->setValidationScheme( AbstractDOMParser::Val_Auto );
71
72 std::cout << "create entity reference flag has default (true) value" << std::endl;
73 parser->parse( xmlchPath );
74 DOMDocument* doc = parser->getDocument();
75 std::cout << "Document successfully parsed" << std::endl;
76 std::cout << "processing local elements.. " << std::endl;
77 Process( doc, "const" );
78 std::cout << std::endl << "processing external elements.. " << std::endl;
79 Process( doc, "extConst" );
80
81 parser->reset();
82 parser->setCreateEntityReferenceNodes( false );
83
84 std::cout << std::endl
85 << std::endl
86 << "create entity reference flag has value false" << std::endl;
87 parser->parse( xmlchPath );
88 DOMDocument* expandDoc = parser->getDocument();
89 std::cout << "Document successfully parsed" << std::endl;
90 std::cout << "processing local elements.. " << std::endl;
91 Process( expandDoc, "const" );
92 std::cout << "processing external elements.. " << std::endl;
93 Process( expandDoc, "extConst" );
94}
95
96void Process( DOMDocument* doc, char* eltName ) {
97 XMLCh* xmlchEltName = XMLString::transcode( eltName );
98 XMLCh* xmlchName = XMLString::transcode( "name" );
99 XMLCh* xmlchValue = XMLString::transcode( "value" );
100 XMLCh* xmlchModified = XMLString::transcode( "modified" );
101 if ( !doc )
102 {
103 std::cerr << "invalid document " << std::endl;
104 return;
105 }
106
107 // Find all elements with supplied tag name
108 DOMNodeList* constList = doc->getElementsByTagName( xmlchEltName );
109 unsigned int nElt = constList->getLength();
110 for ( unsigned int iElt = 0; iElt < nElt; iElt++ )
111 {
112 try
113 {
114 bool mismatch = false;
115 DOMNode* item = constList->item( iElt );
116 DOMElement* itemElt = dynamic_cast<DOMElement*>( item );
117 DOMElement* byIdElt;
118 std::cout << std::endl
119 << eltName << " #" << iElt << " Address as node: " << item
120 << " and as element: " << itemElt << std::endl;
121 const XMLCh* xmlchNamevalue = itemElt->getAttribute( xmlchName );
122 if ( XMLString::stringLen( xmlchNamevalue ) > 0 )
123 {
124 char* namevalue = XMLString::transcode( xmlchNamevalue );
125 std::cout << "element has name " << namevalue << std::endl;
126 byIdElt = doc->getElementById( xmlchNamevalue );
127 std::cout << "Address from getElementById: " << byIdElt << std::endl;
128 if ( byIdElt != itemElt )
129 {
130 mismatch = true;
131 std::cout << "**** Address mismatch " << std::endl << std::endl;
132 }
133 XMLString::release( &namevalue );
134 }
135 std::cout << "Modifying value attribute using DOM_Element address" << std::endl;
136 itemElt->setAttribute( xmlchValue, xmlchModified );
137 if ( mismatch )
138 {
139 std::cout << "Modifying value attribute using looked-up address" << std::endl;
140 byIdElt->setAttribute( xmlchValue, xmlchModified );
141 }
142 } catch ( DOMException ex )
143 {
144 int code = ex.code;
145 std::cout << "***** Processing failed for element #" << iElt
146 << " with DOMException, code = " << code << std::endl
147 << std::endl;
148 }
149 }
150}
151
152// XmlErrorHandler implementation
153void XmlErrorHandler::warning( const SAXParseException& ) { m_nWarning++; }
154
155void XmlErrorHandler::error( const SAXParseException& toCatch ) {
156 char* charSyst = XMLString::transcode( toCatch.getSystemId() );
157 std::string systemId( charSyst );
158 XMLString::release( &charSyst );
159 char* charMsg = XMLString::transcode( toCatch.getMessage() );
160 std::string msg( charMsg );
161 XMLString::release( &charMsg );
162 m_nError++;
163 std::cerr << "Error at file \"" << systemId << "\", line " << toCatch.getLineNumber()
164 << ", column " << toCatch.getColumnNumber() << "\n Message: " << msg << "\n\n";
165}
166
167void XmlErrorHandler::fatalError( const SAXParseException& toCatch ) {
168
169 // getMessage returns type XMLCh*
170 char* charMsg = XMLString::transcode( toCatch.getMessage() );
171 std::string msg( charMsg );
172 XMLString::release( &charMsg );
173 m_nFatal++;
174 if ( !( toCatch.getSystemId() ) )
175 {
176 std::cerr << "Fatal XML parse error: no such file "
177 << "\n Message: " << msg << "\n\n";
178 }
179 else
180 {
181 char* charSyst = XMLString::transcode( toCatch.getSystemId() );
182 std::string systemId( charSyst );
183 XMLString::release( &charSyst );
184 std::cerr << "Fatal error at file \"" << systemId << "\", line " << toCatch.getLineNumber()
185 << ", column " << toCatch.getColumnNumber() << "\n Message: " << msg << "\n\n";
186 }
187}
188void XmlErrorHandler::resetErrors() { m_nWarning = m_nError = m_nFatal = 0; }
int getWarningCount() const
void warning(const SAXParseException &exception)
XmlErrorHandler(std::ostream &errOut=std::cerr)
int getFatalCount() const
int getErrorCount() const
void fatalError(const SAXParseException &exception)
void error(const SAXParseException &exception)
void Process(DOMDocument *doc, char *eltName)
int main()
Definition phokhara.cc:42