2012-04-12 11 views
3

ISO Schematronの標準規格は2年前からありましたが、ISO Schematron XSLTファイル(旧バージョンのSchematronのファイル(例:http://uploading.com/files/c9c9cb87/SchematronXpath.jar/)とは対照的です)を使用してJava実装を見つけることができません。ISO SchematronバリデータのJava実装はどこにありますか?

Javaメソッドから簡単に呼び出せる、実稼動可能なISOスキーマバリデーターを知っている人はいますか?

+0

ない、非常にだまされやすい人、だけでなく、[方法を参照してくださいJavaのSchematronスキーマに対してドキュメントを検証できますか?](http://stackoverflow.com/q/910476/122607) – Pops

答えて

-1

jingライブラリが私に役立ちます。

+3

jingはSchematron 1.5で動作しますが、SchematronのISOバージョンはまだサポートされていません。 [問題23](http://code.google.com/p/jing-trang/issues/detail?id=23&colspec=ID%20Type%20Status%20Priority%20Stars%20Module%20Summary)を参照してください。 – Pops

5

Probatron4jは、ISO Schematronに対して検証できます。このWebサイトには、コマンドラインから実行できるように設計された自己完結型の単一のJARが用意されていますが、its source codeがある場合はProbatronをJavaメソッドから呼び出すのは簡単です。ここで私はそれをやった方法の簡易版です:

public boolean validateSchematron(InputStream xmlDoc, File schematronSchema) { 
    // Session = org.probatron.Session; think of it as the Main class 
    Session theSession = new Session(); 
    theSession.setSchemaSysId(schematronSchema.getName()); 
    theSession.setFsContextDir(schematronSchema.getAbsolutePath()); 

    // ValidationReport = org.probatron.ValidationReport; the output class 
    ValidationReport validationReport = null; 
    try 
    { 
     validationReport = theSession.doValidation(xmlDoc); 
    } 
    catch(Exception e) { /* ignoring to keep this answer short */ } 

    if (validationReport == null || 
     !validationReport.documentPassedValidation()) { 
     return false; 
    } 
    return true; 
} 

あなたはProbatronは、それがJARファイル内から実行されていないが、それは時間はかかりません知っているように、いくつかのマイナーな変更を加える必要があります。

+0

'theSession.doValidation(xmlDoc);'は 'InputStream'を取らず、' String'だけを受け取ります – btiernay

+1

ProbatronはAffero GPLの下でライセンスされていることに注意してください。 IANALですが、商用環境でProbatronを使用する前に相談したい場合があります。 –

9

ph-schematronさらに、XSLTへの変換とネイティブプレーンJavaの検証の両方をサポートしています。ほとんどの場合、XSLTバージョンよりも高速です。 詳細については、https://github.com/phax/ph-schematron/を参照してください。 サンプルコードXMLファイルは、Schematronのファイルと一致するかどうかを確認する:

public static boolean validateXMLViaPureSchematron (File aSchematronFile, File aXMLFile) throws Exception { 
    final ISchematronResource aResPure = SchematronResourcePure.fromFile (aSchematronFile); 
    if (!aResPure.isValidSchematron()) 
    throw new IllegalArgumentException ("Invalid Schematron!"); 
    return aResPure.getSchematronValidity(new StreamSource(aXMLFile)).isValid(); 
} 
+0

こんにちはフィリップ、ph-schematronを使用するのは良いアイデアですが、それはハウツーの方法でサポートされる必要があります。私はそれについて多面的なチュートリアルを見つけることができませんでした。 – GokcenG

+0

情報ありがとうございます。もしあなたがGitHubプロジェクトに問題を提出できるなら、それは素晴らしいことでしょう:) –

+0

は、ph-schematronが非常に便利で使いやすいことを発見しました。どのように私がそれを使用しているかについてのチュートリアルを書くかもしれません。ライブラリを利用できるようにしてくれたPhilipに感謝します。 – MohamedSanaulla

0

あなたはSchematronAssert(:私のコード開示)をチェックアウトすることができます。主に単体テストのためのものですが、通常のコードにも使用できます。 XSLTを使用して実装されています。

ユニットテストの例:

ValidationOutput result = in(booksDocument) 
    .forEvery("book") 
    .check("author") 
    .validate(); 
assertThat(result).hasNoErrors(); 

スタンドアロンの検証例:

StreamSource schemaSource = new StreamSource(... your schematron schema ...); 
StreamSource xmlSource = new StreamSource(... your xml document ...); 
StreamResult output = ... here your SVRL will be saved ... 
// validation 
validator.validate(xmlSource, schemaSource, output); 

SVRLのオブジェクト表現と協力:

ValidationOutput output = validator.validate(xmlSource, schemaSource); 
// look at the output 
output.getFailures() ... 
output.getReports() ... 
関連する問題