2013-03-27 77 views
2
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文档的字符串表示形式。 下面,捕捉,可以通过验证根据XSD模式验证XML并使用groovy捕获验证器期望

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 {}循环或类似的东西?

希望它已经足够清晰

在此先感谢!

回答

6

这应该做你想要什么:

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" 
} 

或者稍微ideomatic常规版本将是:

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 
    } 
} 
+0

真棒!并学习了一些新功能(我将要搜索它现在的功能)非常感谢! – kanadianDri3 2013-03-27 10:22:27

+0

@ kanadianDri3对任何代码有任何疑问,请随时在此发表评论! :-) – 2013-03-27 10:24:08

+0

好吧,那么......我的问题涉及'Closure handler = {exception - > exceptions << exception}'这一行。什么是和如何使用'Closure '?在大括号里面,' - >'符号是什么意思? – kanadianDri3 2013-03-27 10:47:22