【问题标题】:Validating a XML against a XSD schema and catching validator expection with groovy针对 XSD 模式验证 XML 并使用 groovy 捕获验证器期望
【发布时间】:2013-03-27 09:50:55
【问题描述】:
def validateXml(xml){

    String xsd = "src/main/ressources/fulltext-documents-v1.2.3.xsd"

    def factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
    def schema = factory.newSchema(new StreamSource(new File(xsd)))
    def validator = schema.newValidator()
    validator.validate(new StreamSource(new StringReader(xml)))
}

这是我验证 xml 文档的字符串表示的函数。 在另一个捕获验证器可能引发的异常的函数下方

def xmlVerification(xml) {

    Node rootNode = new XmlParser().parseText(xml)
    def stringXml = XmlUtil.serialize(rootNode)

    try{
        validateXml(stringXml)
        println "no error in text"
    }catch(SAXParseException e){
        println "column number "+e.getColumnNumber()
        println "line number"+e.getLineNumber()
    }
}

现在它只显示引发异常的列和行号(目前对我来说已经足够了)。

现在,假设我的文档至少有 2 个错误。我希望得到这两个错误(例如在表格中)然后处理它们。 使用我的代码,它会在引发的第一个异常时停止,因此我无法处理这 2 个错误。我必须更正第一个才能更正第二个(通过再次运行我的代码)。

知道如何浏览整个文档、存储所有异常并在 .each{} 循环或类似的东西中处理它们吗?

希望它足够清楚

提前致谢!

【问题讨论】:

    标签: xml exception-handling groovy xsd validation


    【解决方案1】:

    这应该做你想做的:

    import org.xml.sax.ErrorHandler
    import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI
    import javax.xml.transform.stream.StreamSource
    import javax.xml.validation.Schema
    import javax.xml.validation.SchemaFactory
    import javax.xml.validation.Validator
    
    List findProblems( File xml, File xsd ) {
      SchemaFactory factory = SchemaFactory.newInstance( W3C_XML_SCHEMA_NS_URI )
      Schema schema = factory.newSchema( new StreamSource( xsd ) )
      Validator validator = schema.newValidator()
      List exceptions = []
      Closure<Void> handler = { exception -> exceptions << exception }
      validator.errorHandler = [ warning:    handler,
                                 fatalError: handler,
                                 error:      handler ] as ErrorHandler
      validator.validate( new StreamSource( xml ) )
      exceptions
    }
    
    // Two files I got for testing
    File xml = new File( 'books.xml' )
    File xsd = new File( 'books.xsd' )
    
    // Call the method, and print out each exception
    findProblems( xml, xsd ).each {
      println "Problem @ line $it.lineNumber, col $it.columnNumber : $it.message"
    }
    

    或者更符合概念的 groovy 版本是:

    import org.xml.sax.ErrorHandler
    import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI
    import javax.xml.transform.stream.StreamSource
    import javax.xml.validation.SchemaFactory
    
    List findProblems( File xml, File xsd ) {
      SchemaFactory.newInstance( W3C_XML_SCHEMA_NS_URI )
                   .newSchema( new StreamSource( xsd ) )
                   .newValidator().with { validator ->
        List exceptions = []
        Closure<Void> handler = { exception -> exceptions << exception }
        errorHandler = [ warning: handler, fatalError: handler, error: handler ] as ErrorHandler
        validate( new StreamSource( xml ) )
        exceptions
      }
    }
    

    【讨论】:

    • 太棒了!并且还学习了一些新功能(我将搜索它现在的功能)非常感谢!
    • @kanadianDri3 对任何代码有任何疑问,请随时在评论中提问! :-)
    • 好的,那么...我的问题与Closure&lt;Void&gt; handler = { exception -&gt; exceptions &lt;&lt; exception } 相关。 Closure&lt;Void&gt; 是什么以及如何使用?在大括号内,-&gt; 符号是什么意思?
    • @kanadianDri3 啊,是的Closure&lt;Void&gt; handler 只是意味着handler 是一个不返回任何东西的闭包。如果需要,您可以将其更改为 def。而闭包定义{ exception -&gt; exceptions &lt;&lt; exception } 的意思是“一个闭包,它接受一个名为exception 的参数,并在调用时将此对象添加到列表exceptions -&gt; 左侧的位定义参数,右边的位定义方法体。
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多