28 #include <xercesc/sax2/XMLReaderFactory.hpp> 29 #include <xercesc/framework/LocalFileInputSource.hpp> 30 #include <xercesc/framework/MemBufInputSource.hpp> 46 : myHandler(nullptr), myValidationScheme(validationScheme), myXMLReader(nullptr), myBinaryInput(nullptr) {
71 if (validationScheme == XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Never) {
73 myXMLReader->setProperty(XERCES_CPP_NAMESPACE::XMLUni::fgXercesScannerName, (
void*)XERCES_CPP_NAMESPACE::XMLUni::fgWFXMLScanner);
76 myXMLReader->setProperty(XERCES_CPP_NAMESPACE::XMLUni::fgXercesScannerName, (
void*)XERCES_CPP_NAMESPACE::XMLUni::fgIGXMLScanner);
77 myXMLReader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgXercesSchema,
true);
78 myXMLReader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgSAX2CoreValidation,
true);
79 myXMLReader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgXercesDynamic, validationScheme == XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto);
88 if (systemID.length() >= 4 && systemID.substr(systemID.length() - 4) ==
".sbx") {
106 XERCES_CPP_NAMESPACE::MemBufInputSource memBufIS((
const XMLByte*)content.c_str(), content.size(),
"registrySettings");
113 if (systemID.substr(systemID.length() - 4) ==
".sbx") {
116 if (mySbxVersion < 1 || mySbxVersion > 2) {
121 std::vector<std::string> elems;
136 std::vector< std::vector<int> > followers;
144 myToken = XERCES_CPP_NAMESPACE::XMLPScanToken();
161 unsigned char tagByte;
167 tag += 256 * tagByte;
176 throw ProcessError(
"Binary file is invalid, unexpected tag end.");
184 throw ProcessError(
"Binary file is invalid, expected tag start or tag end.");
189 throw ProcessError(
"The XML-parser was not initialized.");
196 XERCES_CPP_NAMESPACE::SAX2XMLReader*
198 XERCES_CPP_NAMESPACE::SAX2XMLReader* reader = XERCES_CPP_NAMESPACE::XMLReaderFactory::createXMLReader();
199 if (reader ==
nullptr) {
200 throw ProcessError(
"The XML-parser could not be build.");
204 reader->setProperty(XERCES_CPP_NAMESPACE::XMLUni::fgXercesScannerName, (
void*)XERCES_CPP_NAMESPACE::XMLUni::fgWFXMLScanner);
207 reader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgXercesSchema,
true);
208 reader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgSAX2CoreValidation,
true);
209 reader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgXercesDynamic,
myValidationScheme == XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto);
217 XERCES_CPP_NAMESPACE::InputSource*
220 const std::string::size_type pos = url.rfind(
"/");
221 if (pos != std::string::npos) {
222 const std::string dir = url.substr(0, pos);
223 if (dir ==
"http://sumo.sf.net/xsd" || dir ==
"http://sumo-sim.org/xsd" || dir ==
"http://sumo-sim.org/xsd/amitran" ||
224 dir ==
"http://sumo.dlr.de/xsd" || dir ==
"http://sumo.dlr.de/xsd/amitran") {
226 const char* sumoPath = std::getenv(
"SUMO_HOME");
227 if (sumoPath ==
nullptr) {
228 WRITE_WARNING(
"Environment variable SUMO_HOME is not set, schema resolution will use slow website lookups.");
231 const std::string file = sumoPath + std::string(
"/data/xsd") + url.substr(url.find(
"/xsd/") + 4);
233 XMLCh* t = XERCES_CPP_NAMESPACE::XMLString::transcode(file.c_str());
234 XERCES_CPP_NAMESPACE::InputSource*
const result =
new XERCES_CPP_NAMESPACE::LocalFileInputSource(t);
235 XERCES_CPP_NAMESPACE::XMLString::release(&t);
238 WRITE_WARNING(
"Cannot find local schema '" + file +
"', will try website lookup.");
std::vector< SumoXMLTag > myXMLStack
The stack of begun xml elements.
SumoXMLTag
Numbers representing SUMO-XML - element names.
SUMOSAXReader(GenericSAXHandler &handler, const XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes validationScheme)
Constructor.
static bool isReadable(std::string path)
Checks whether the given file is readable.
XERCES_CPP_NAMESPACE::SAX2XMLReader * getSAXReader()
Builds a reader.
void setValidation(const XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes validationScheme)
XERCES_CPP_NAMESPACE::XMLPScanToken myToken
void parseString(std::string content)
BinaryInputDevice * myBinaryInput
#define WRITE_WARNING(msg)
void setSchemaSeen(const bool schemaSeen=true)
static std::string transcode(const XMLCh *const data)
converts a 0-terminated XMLCh* array (usually UTF-16, stemming from Xerces) into std::string in UTF-8...
A handler which converts occuring elements and attributes into enums.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
void parse(std::string systemID)
void setHandler(GenericSAXHandler &handler)
XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes myValidationScheme
Information whether built reader/parser shall validate XML-documents against schemata.
bool parseFirst(std::string systemID)
virtual void myStartElement(int element, const SUMOSAXAttributes &attrs)
Callback method for an opening tag to implement by derived classes.
Encapsulated Xerces-SAX-attributes.
XERCES_CPP_NAMESPACE::SAX2XMLReader * myXMLReader
void setHandler(GenericSAXHandler &handler)
Sets the given handler as content and error handler for the reader.
LocalSchemaResolver mySchemaResolver
std::map< int, std::string > myPredefinedTagsMML
the map from ids to their string representation
XERCES_CPP_NAMESPACE::InputSource * resolveEntity(const XMLCh *const publicId, const XMLCh *const systemId)
~SUMOSAXReader()
Destructor.
GenericSAXHandler * myHandler
virtual void myEndElement(int element)
Callback method for a closing tag to implement by derived classes.