29 #include <xercesc/sax2/XMLReaderFactory.hpp>
30 #include <xercesc/framework/LocalFileInputSource.hpp>
31 #include <xercesc/framework/MemBufInputSource.hpp>
51 : myHandler(nullptr), myValidationScheme(validationScheme), myXMLReader(nullptr), myBinaryInput(nullptr), myIStream(nullptr), myInputStream(nullptr) {
76 if (validationScheme == XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Never) {
78 myXMLReader->setProperty(XERCES_CPP_NAMESPACE::XMLUni::fgXercesScannerName, (
void*)XERCES_CPP_NAMESPACE::XMLUni::fgWFXMLScanner);
81 myXMLReader->setProperty(XERCES_CPP_NAMESPACE::XMLUni::fgXercesScannerName, (
void*)XERCES_CPP_NAMESPACE::XMLUni::fgIGXMLScanner);
82 myXMLReader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgXercesSchema,
true);
83 myXMLReader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgSAX2CoreValidation,
true);
84 myXMLReader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgXercesDynamic, validationScheme == XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto);
93 if (systemID.length() >= 4 && systemID.substr(systemID.length() - 4) ==
".sbx") {
102 throw ProcessError(
"Cannot read file '" + systemID +
"'!");
105 zstr::ifstream istream(systemID.c_str(), std::fstream::in | std::fstream::binary);
119 XERCES_CPP_NAMESPACE::MemBufInputSource memBufIS((
const XMLByte*)content.c_str(), content.size(),
"registrySettings");
126 if (systemID.length() >= 4 && systemID.substr(systemID.length() - 4) ==
".sbx") {
129 if (mySbxVersion < 1 || mySbxVersion > 2) {
134 std::vector<std::string> elems;
149 std::vector< std::vector<int> > followers;
155 throw ProcessError(
"Cannot read file '" + systemID +
"'!");
160 myToken = XERCES_CPP_NAMESPACE::XMLPScanToken();
162 myIStream = std::unique_ptr<zstr::ifstream>(
new zstr::ifstream(systemID.c_str(), std::fstream::in | std::fstream::binary));
183 unsigned char tagByte;
189 tag += 256 * tagByte;
198 throw ProcessError(
"Binary file is invalid, unexpected tag end.");
206 throw ProcessError(
"Binary file is invalid, expected tag start or tag end.");
211 throw ProcessError(
"The XML-parser was not initialized.");
218 XERCES_CPP_NAMESPACE::SAX2XMLReader*
220 XERCES_CPP_NAMESPACE::SAX2XMLReader* reader = XERCES_CPP_NAMESPACE::XMLReaderFactory::createXMLReader();
221 if (reader ==
nullptr) {
222 throw ProcessError(
"The XML-parser could not be build.");
226 reader->setProperty(XERCES_CPP_NAMESPACE::XMLUni::fgXercesScannerName, (
void*)XERCES_CPP_NAMESPACE::XMLUni::fgWFXMLScanner);
229 reader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgXercesSchema,
true);
230 reader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgSAX2CoreValidation,
true);
231 reader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgXercesDynamic,
myValidationScheme == XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto);
239 XERCES_CPP_NAMESPACE::InputSource*
242 const std::string::size_type pos = url.find(
"/xsd/");
243 if (pos != std::string::npos) {
245 const char* sumoPath = std::getenv(
"SUMO_HOME");
246 if (sumoPath ==
nullptr) {
247 WRITE_WARNING(
"Environment variable SUMO_HOME is not set, schema resolution will use slow website lookups.");
250 const std::string file = sumoPath + std::string(
"/data") + url.substr(pos);
253 XERCES_CPP_NAMESPACE::InputSource*
const result =
new XERCES_CPP_NAMESPACE::LocalFileInputSource(t);
254 XERCES_CPP_NAMESPACE::XMLString::release(&t);
257 WRITE_WARNING(
"Cannot read local schema '" + file +
"', will try website lookup.");