【问题标题】:How to dissemble a SaxParseException (cvc-pattern-valid)?如何伪装 SaxParseException (cvc-pattern-valid)?
【发布时间】:2012-02-14 16:29:59
【问题描述】:

针对带有 xs:pattern 的 xs:simpleType 处理 xml-data 验证错误的最佳方法是什么?

例如针对

的验证
<xs:simpleType name="IBANIdentifier">
  <xs:restriction base="xs:string">
    <xs:pattern value="[a-zA-Z]{2,2}[0-9]{2,2}[a-zA-Z0-9]{1,30}"/>
  </xs:restriction>
</xs:simpleType>

会导致这个 SaxParseException:

org.xml.sax.SAXParseException: cvc-pattern-valid: Value 'XXAA99999999999911' is 
not facet-valid with respect to pattern '[a-zA-Z]{2,2}[0-9]{2,2}[a-zA-Z0-9]{1,30}
for type 'IBANIdentifier'.

在我的 DefaultHandler.error() 中,如何访问

  • 模式
  • 实际价值
  • 简单类型的名称

不解析错误信息?

异常不以结构化形式保存此信息,AFAIKS。解析器有一些状态,但我没有找到我需要的信息。

【问题讨论】:

    标签: java xml exception-handling sax


    【解决方案1】:

    您可以通过编写自己的错误处理程序并使用validator.setErrorHandler(new CollectingErrorHandler(errors, shouldConsiderWarningsAsErrors)); 向验证器注册来捕获所有验证错误/警告

    CollectingErrorHandler 现在可以访问所有验证错误。现在,没有报告这些错误的标准格式,并且可能会因解析器实现而改变。所以坚持使用一种解析器实现并使用正则表达式进行解析。

    public final class CollectingErrorHandler implements ErrorHandler
    {
        private final List<SAXException> l;
    
        private final boolean warningsAreErrors;
    
        public CollectingErrorHandler(final List<SAXException> l, final boolean shouldConsiderWarningsAsErrors)
        {
            this.l = l;
            warningsAreErrors = shouldConsiderWarningsAsErrors;
        }
    
        public void error(final SAXParseException e)
        {
            l.add(e);
        }
    
        public void fatalError(final SAXParseException e)
        {
            l.add(e);
        }
    
        public void warning(final SAXParseException e)
        {
            if (warningsAreErrors)
            {
                l.add(e);
            }
        }
    }
    

    【讨论】:

    • 很有趣,因为它并没有真正回答问题(我仍然必须在味精上解析/正则表达式),但它回答了一个隐含的问题,即收集所有验证错误,这实际上是另一个问题使用这些简单类型,因为我不希望解析器在第一个验证错误时中止。谢谢你!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    相关资源
    最近更新 更多