验证xerces-c SAX解析器

时间:2017-03-01 22:07:15

标签: xml validation xerces-c

我正在尝试使用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无关。

1 个答案:

答案 0 :(得分:0)

Derp,这是我的错。我的错误处理程序对象是使用:

构建的
class MySAXErrorHandler : public HandlerBase {
public:
    virtual void fatalError(const SAXParseException &exc) { throw exc; }
};

虽然通过fatalError()报告结构错误,但通过error()报告验证错误。 HandlerBase类有一个默认的error()实现,“什么都不做”。除了fatalError()之外,覆盖error()解决了这个问题。