我正在尝试使用Xerces-C来解析带有验证XSD或DTD的XML。遗憾的是,未报告验证错误。以下是我如何设置它:
saxParser = new MySAXParser;
saxParser->setDoNamespaces(true);
saxParser->setValidationScheme(MySAXParser::Val_Auto);
saxParser->setDoSchema(true);
saxParser->setValidationConstraintFatal(true);
saxParser->setExitOnFirstFatalError(true);
MySAXErrorHandler handler;
saxParser->setErrorHandler(&handler);
saxParser->parse(...);
不幸的是,我的错误处理程序的这个方法永远不会被调用:
virtual void fatalError(const XN::SAXParseException &exc) { throw exc; }
发生验证错误时,调用内部Xerces方法 :
void XMLValidator::emitError(const XMLValid::Codes toEmit
, const XMLCh* const text1
, const XMLCh* const text2
, const XMLCh* const text3
, const XMLCh* const text4)
然而,它来到这里:
if (fErrorReporter)
但是fErrorReporter为null,因此没有报告任何内容。我想安装一个错误报告器(它是XMLErrorReporter类型),在那里我可以跟踪消息和/或抛出我自己的异常,但我不知道如何做到这一点。
我可以调用saxParser-> getErrorCount()并返回非零值,这很好。这让我报告"出现了错误!"。但错误文本和位置未被捕获。
更新:这是Xerces-c 3.1版
请注意,我已阅读this,但它似乎与SAX无关。
答案 0 :(得分:0)
Derp,这是我的错。我的错误处理程序对象是使用:
构建的class MySAXErrorHandler : public HandlerBase {
public:
virtual void fatalError(const SAXParseException &exc) { throw exc; }
};
虽然通过fatalError()报告结构错误,但通过error()报告验证错误。 HandlerBase类有一个默认的error()实现,“什么都不做”。除了fatalError()之外,覆盖error()解决了这个问题。