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ドキュメントの文字列表現を検証するための私の関数です。バリデーターによって発生する可能性のある例外をキャッチする他の関数の下

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つのエラー(たとえば、テーブル内)を取得して、それらを処理することです。私のコードでは、発生した最初の例外で停止するため、2つのエラーを処理できません。2番目のものを修正するために最初のものを修正する必要があります(コードを2回再実行することによって)。

ドキュメント全体を調べ、すべての例外をストックして、.each {}ループなどで処理する方法はありますか?

それが十分に明確であったことを願っています

前もって感謝します !

4

1 に答える 1

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

または、もう少しイデオマティックなグルーヴィーなバージョンは次のようになります。

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
  }
}
于 2013-03-27T10:07:12.103 に答える