28 #include <xercesc/sax2/XMLReaderFactory.hpp>
29 #include <xercesc/framework/LocalFileInputSource.hpp>
30 #include <xercesc/framework/MemBufInputSource.hpp>
50 : myHandler(nullptr), myValidationScheme(validationScheme), myXMLReader(nullptr), myBinaryInput(nullptr), myIStream(nullptr), myInputStream(nullptr) {
75 if (validationScheme == XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Never) {
77 myXMLReader->setProperty(XERCES_CPP_NAMESPACE::XMLUni::fgXercesScannerName, (
void*)XERCES_CPP_NAMESPACE::XMLUni::fgWFXMLScanner);
80 myXMLReader->setProperty(XERCES_CPP_NAMESPACE::XMLUni::fgXercesScannerName, (
void*)XERCES_CPP_NAMESPACE::XMLUni::fgIGXMLScanner);
81 myXMLReader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgXercesSchema,
true);
82 myXMLReader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgSAX2CoreValidation,
true);
83 myXMLReader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgXercesDynamic, validationScheme == XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto);
92 if (systemID.length() >= 4 && systemID.substr(systemID.length() - 4) ==
".sbx") {
101 throw ProcessError(
"Cannot read file '" + systemID +
"'!");
104 throw ProcessError(
"File '" + systemID +
"' is a directory!");
107 zstr::ifstream istream(systemID.c_str(), std::fstream::in | std::fstream::binary);
121 XERCES_CPP_NAMESPACE::MemBufInputSource memBufIS((
const XMLByte*)content.c_str(), content.size(),
"registrySettings");
128 if (systemID.length() >= 4 && systemID.substr(systemID.length() - 4) ==
".sbx") {
131 if (mySbxVersion < 1 || mySbxVersion > 2) {
136 std::vector<std::string> elems;
151 std::vector< std::vector<int> > followers;
157 throw ProcessError(
"Cannot read file '" + systemID +
"'!");
162 myToken = XERCES_CPP_NAMESPACE::XMLPScanToken();
164 myIStream = std::unique_ptr<zstr::ifstream>(
new zstr::ifstream(systemID.c_str(), std::fstream::in | std::fstream::binary));
185 unsigned char tagByte;
191 tag += 256 * tagByte;
200 throw ProcessError(
"Binary file is invalid, unexpected tag end.");
208 throw ProcessError(
"Binary file is invalid, expected tag start or tag end.");
213 throw ProcessError(
"The XML-parser was not initialized.");
220 XERCES_CPP_NAMESPACE::SAX2XMLReader*
222 XERCES_CPP_NAMESPACE::SAX2XMLReader* reader = XERCES_CPP_NAMESPACE::XMLReaderFactory::createXMLReader();
223 if (reader ==
nullptr) {
224 throw ProcessError(
"The XML-parser could not be build.");
228 reader->setProperty(XERCES_CPP_NAMESPACE::XMLUni::fgXercesScannerName, (
void*)XERCES_CPP_NAMESPACE::XMLUni::fgWFXMLScanner);
231 reader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgXercesSchema,
true);
232 reader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgSAX2CoreValidation,
true);
233 reader->setFeature(XERCES_CPP_NAMESPACE::XMLUni::fgXercesDynamic,
myValidationScheme == XERCES_CPP_NAMESPACE::SAX2XMLReader::Val_Auto);
241 XERCES_CPP_NAMESPACE::InputSource*
244 const std::string::size_type pos = url.find(
"/xsd/");
245 if (pos != std::string::npos) {
247 const char* sumoPath = std::getenv(
"SUMO_HOME");
248 if (sumoPath ==
nullptr) {
249 WRITE_WARNING(
"Environment variable SUMO_HOME is not set, schema resolution will use slow website lookups.");
252 const std::string file = sumoPath + std::string(
"/data") + url.substr(pos);
255 XERCES_CPP_NAMESPACE::InputSource*
const result =
new XERCES_CPP_NAMESPACE::LocalFileInputSource(t);
256 XERCES_CPP_NAMESPACE::XMLString::release(&t);
259 WRITE_WARNING(
"Cannot read local schema '" + file +
"', will try website lookup.");