【问题标题】:Error handling in validating xerces-c SAX parser验证 xerces-c SAX 解析器时的错误处理
【发布时间】:2017-03-01 22:07:14
【问题描述】:

我正在尝试使用 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 为空,因此没有报告任何内容。我想安装一个错误报告器(它是 XMLErrorReporter 类型),我可以在其中跟踪消息和/或抛出我自己的异常,但我不知道该怎么做。

可以调用 saxParser->getErrorCount() 并且它返回非零,这很好。那让我报告“发生错误!”。但是没有捕获错误文本和位置。

更新:这是 Xerces-c 3.1 版

请注意,我已阅读 this,但它似乎不适用于 SAX。

【问题讨论】:

  • 也许这不是一个致命错误,而只是一个错误,您是否覆盖了所有错误报告方法?
  • 是的,就是这样。

标签: xml validation xerces-c


【解决方案1】:

Derp,这是我的错误。我的错误处理程序对象是使用以下内容构建的:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-13
    • 2015-09-28
    • 2011-03-19
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多