我正在尝试为我正在工作的项目编写一个快速且脏的XML验证器。我目前正在使用Xerces C ++。
使用XercesDOMParser很容易根据提供的XSD架构验证xml的语法,但这只是我想要的部分。
我希望能够验证这些值。
因此,例如,如果XSD架构指定值必须是xs:date
<xs:element name="DOB" type="xs:date"/>
但XML只包含(例如)随机字符串,例如
<DOB>banana</DOB>
我希望将其标记为错误。
这种形式的验证是否可以使用Xerces?
编辑:
这是我对ErrorHandler的重写:
class MyErrorHandler : public ErrorHandler
{
public :
virtual void warning(const SAXParseException& exc);
virtual void error(const SAXParseException& exc);
virtual void fatalError(const SAXParseException& exc);
virtual void resetErrors();
};
void MyErrorHandler::warning(const SAXParseException& exc)
{
std::cout << "WARNING\n";
}
void MyErrorHandler::error(const SAXParseException& exc)
{
std::cout << "ERROR\n";
}
void MyErrorHandler::fatalError(const SAXParseException& exc)
{
char* message = xercesc::XMLString::transcode(exc.getMessage());
std::cout << "Fatal " << message << " at line " << exc.getLineNumber() << " column " << exc.getColumnNumber() << std::endl;
xercesc::XMLString::release(&message);
}
这是主要的:
int main(int argc, char **argv)
{
if (argc == 3)
{
struct stat buffer;
if ( (stat(argv[1], &buffer) == 0) && (stat(argv[2], &buffer) == 0))
{
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
return 1;
}
XercesDOMParser* parser = new XercesDOMParser();
parser->setExternalNoNamespaceSchemaLocation(argv[1]);
parser->setExitOnFirstFatalError(true);
parser->setValidationConstraintFatal(true);
parser->setValidationScheme(XercesDOMParser::Val_Auto);
parser->setDoNamespaces(false);
parser->setDoSchema(true);
parser->setValidationSchemaFullChecking(true);
MyErrorHandler errorHandler;
parser->setErrorHandler(&errorHandler);
std::string xmlFile(argv[2]);
try {
parser->parse(xmlFile.c_str());
}
catch (const DOMException& e)
{
std::cout << "DOM Exception.." << std::endl;
}
catch (const SAXException& e)
{
std::cout << "SAX Exception.." << std::endl;
}
catch (const XMLException& e)
{
std::cout << "XML Exception.." << std::endl;
}
XMLPlatformUtils::Terminate();
}
else
{
std::cerr << "XSD/XML file absent\n";
}
}
else
{
std::cerr << "Incorrect number of arguments - Usage : " << argv[0] << " <sample schema> <sample xml>\n";
}
}