27 #include <xercesc/sax2/XMLReaderFactory.hpp>
28 #include <xercesc/framework/LocalFileInputSource.hpp>
29 #include <xercesc/framework/MemBufInputSource.hpp>
42 using XERCES_CPP_NAMESPACE::SAX2XMLReader;
43 using XERCES_CPP_NAMESPACE::XMLUni;
50 : myHandler(nullptr), myValidationScheme(validationScheme), myGrammarPool(grammarPool), myXMLReader(nullptr), myIStream(nullptr), myInputStream(nullptr) {
74 if (validationScheme == SAX2XMLReader::Val_Never) {
76 myXMLReader->setProperty(XMLUni::fgXercesScannerName, (
void*)XMLUni::fgWFXMLScanner);
79 myXMLReader->setProperty(XMLUni::fgXercesScannerName, (
void*)XMLUni::fgIGXMLScanner);
80 myXMLReader->setFeature(XMLUni::fgXercesSchema,
true);
81 myXMLReader->setFeature(XMLUni::fgSAX2CoreValidation,
true);
82 myXMLReader->setFeature(XMLUni::fgXercesDynamic, validationScheme == SAX2XMLReader::Val_Auto);
96 throw ProcessError(
"Cannot read file '" + systemID +
"'!");
99 throw ProcessError(
"File '" + systemID +
"' is a directory!");
115 XERCES_CPP_NAMESPACE::MemBufInputSource memBufIS((
const XMLByte*)content.c_str(), content.size(),
"registrySettings");
123 throw ProcessError(
"Cannot read file '" + systemID +
"'!");
128 myToken = XERCES_CPP_NAMESPACE::XMLPScanToken();
142 throw ProcessError(
"The XML-parser was not initialized.");
150 SAX2XMLReader* reader = XERCES_CPP_NAMESPACE::XMLReaderFactory::createXMLReader(XERCES_CPP_NAMESPACE::XMLPlatformUtils::fgMemoryManager,
myGrammarPool);
151 if (reader ==
nullptr) {
152 throw ProcessError(
"The XML-parser could not be build.");
156 reader->setProperty(XMLUni::fgXercesScannerName, (
void*)XMLUni::fgWFXMLScanner);
159 reader->setFeature(XMLUni::fgXercesSchema,
true);
160 reader->setFeature(XMLUni::fgSAX2CoreValidation,
true);
161 reader->setFeature(XMLUni::fgXercesDynamic,
myValidationScheme == SAX2XMLReader::Val_Auto);
162 reader->setFeature(XMLUni::fgXercesUseCachedGrammarInParse,
myValidationScheme == SAX2XMLReader::Val_Always);
170 XERCES_CPP_NAMESPACE::InputSource*
173 const std::string::size_type pos = url.find(
"/xsd/");
174 if (pos != std::string::npos) {
175 const char* sumoPath = std::getenv(
"SUMO_HOME");
176 if (sumoPath ==
nullptr) {
180 const std::string file = sumoPath + std::string(
"/data") + url.substr(pos);
183 XERCES_CPP_NAMESPACE::InputSource*
const result =
new XERCES_CPP_NAMESPACE::LocalFileInputSource(t);
184 XERCES_CPP_NAMESPACE::XMLString::release(&t);
187 WRITE_WARNING(
"Cannot read local schema '" + file +
"', will try website lookup.");
#define WRITE_WARNING(msg)
std::string transcode(const XMLCh *const qname)
static bool isReadable(std::string path)
Checks whether the given file is readable.
static bool isDirectory(std::string path)
Checks whether the given file is a directory.
A handler which converts occuring elements and attributes into enums.
void setHandler(GenericSAXHandler &handler)
XERCES_CPP_NAMESPACE::InputSource * resolveEntity(const XMLCh *const publicId, const XMLCh *const systemId)
XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes myValidationScheme
Information whether built reader/parser shall validate XML-documents against schemata.
std::unique_ptr< IStreamInputSource > myInputStream
SUMOSAXReader(GenericSAXHandler &handler, const XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes validationScheme, XERCES_CPP_NAMESPACE::XMLGrammarPool *grammarPool)
Constructor.
void setHandler(GenericSAXHandler &handler)
Sets the given handler as content and error handler for the reader.
void parseString(std::string content)
bool parseFirst(std::string systemID)
std::unique_ptr< std::istream > myIStream
LocalSchemaResolver mySchemaResolver
void setValidation(const XERCES_CPP_NAMESPACE::SAX2XMLReader::ValSchemes validationScheme)
~SUMOSAXReader()
Destructor.
XERCES_CPP_NAMESPACE::SAX2XMLReader * getSAXReader()
Builds a reader.
GenericSAXHandler * myHandler
void parse(std::string systemID)
XERCES_CPP_NAMESPACE::SAX2XMLReader * myXMLReader
XERCES_CPP_NAMESPACE::XMLGrammarPool * myGrammarPool
Schema cache to be used for grammars which are not declared.
XERCES_CPP_NAMESPACE::XMLPScanToken myToken
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
static std::string transcodeToLocal(const std::string &utf8String)
convert a string from UTF-8 to the local codepage