2016-10-17 7 views
1

私はJavax Marshallerを使ってxmlを生成しています。私は、生成されたXML agaisnt XSDを検証する方法を探しています。私はこれを行うためにgradleのプラグインを見つけました。JavaでXSDに対して生成されたXMLを検証する最良の方法はありますか?

buildscript { 
 
    repositories { 
 
\t jcenter() 
 
    maven { 
 
     url "https://plugins.gradle.org/m2/" 
 
    } 
 
    } 
 
    dependencies { 
 
    classpath "gradle.plugin.com.github.ramonwirsch:fopRenderer:0.1.7" 
 
    } 
 
} 
 

 
apply plugin: "com.github.ramonwirsch.FopRenderer" 
 
apply plugin: 'java' 
 
apply plugin: 'eclipse' 
 

 

 

 
sourceCompatibility=1.8 
 
targetCompatibility=1.8 
 

 

 

 

 
project.ext { 
 
\t app_name='XSD-XML' 
 
\t build_date=new Date().format("yyyyMMddHHmm") 
 
\t release_number='R1.0' 
 
\t rc_build="${System.env.BUILD_NUMBER}"//look for BUILD_NUMBER in env (set by Jenkins) 
 
\t generatedSrcDir = file("$buildDir/generated-src") \t 
 
\t jaxb_schema='src/main/resources/xsd' 
 
\t jaxbTargetDir = generatedSrcDir 
 
\t 
 
} 
 

 

 

 
repositories { \t 
 
// removed corporate repository details for security 
 
jcenter() 
 
\t 
 
} 
 

 

 
configurations { 
 
\t jaxb \t 
 
} 
 

 

 
dependencies { 
 
\t // Needed to generate JAX binding code 
 
\t jaxb 'com.sun.xml.bind:jaxb-xjc:2.2.4-1' 
 
\t 
 
} 
 

 

 

 

 
def generatedResources = 'src/main/generated' 
 

 
task jaxb(){ 
 
\t description 'Converts xsds to classes' 
 
\t def jaxbTargetDir = file(generatedResources) 
 
\t jaxbTargetDir.deleteDir() 
 
\t 
 
\t doLast { 
 
\t \t jaxbTargetDir.mkdirs() 
 

 
\t \t ant.taskdef(name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask', classpath: configurations.jaxb.asPath) 
 
\t \t ant.jaxbTargetDir = jaxbTargetDir 
 
\t \t 
 
\t \t ant.xjc(destdir: '${jaxbTargetDir}', package: 'com.pavan.xml.java.binding') { 
 
\t \t \t \t schema(dir:'src/main/resources/xsd', includes: '*.xsd') 
 
\t \t } \t \t 
 
\t } 
 
} 
 

 
task generateSources(dependsOn: jaxb) { 
 
\t description 'generates the resources defined by the external xsd\'s' 
 
} 
 

 
sourceSets { 
 
\t main { 
 
\t \t java { 
 
\t \t \t srcDirs = ['src/main/java', 'src/main/generated'] 
 
\t \t } 
 
\t } 
 
} 
 

 
compileJava.dependsOn jaxb

これを行うに任意のより良い方法があります:それは私のbuild.gradleファイルいくつかのエラーに

Could not resolve gradle.plugin.com.github.ramonwirsch:fopRenderer:0.1.7 

を与えているので、しかし、私は、このプラグインを使用couldntの。私はこのリンクを経由していた What's the best way to validate an XML file against an XSD file?。答えのほとんどは2008年からのものですが、私はこれを行うために今より良い方法が利用できるかどうか不思議です。

+0

build.gradleファイルを共有できますか? –

+0

@IssamELATIFが私のbuild.gradleファイル – PKR

答えて

2

JAXBを使用しています.JAXBはJavaでXMLを処理するための「標準的な」方法です。このサンプルコードは、生成された(xjcによる)Javaクラスと検証する複数のXSDの複数のパッケージと、Marshallerのプロパティの設定を示しています。たJAXBContextとスキーマはスレッドセーフであり、通常の静的初期化子で、一度作成され、複数のスレッドによって永遠に再利用できること

// This part can be in a static initializer, with `jaxbContext` and `schema` as static variables. 
JAXBContext jaxbContext = JAXBContext.newInstance("package1:package2); 
try (InputStream xsdStream1 = EraMarshallingService.class.getResourceAsStream("/a.xsd"); 
     InputStream xsdStream2 = EraMarshallingService.class.getResourceAsStream("/b.xsd"); 
     InputStream xsdStream3 = EraMarshallingService.class.getResourceAsStream("/c.xsd");) { 
    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Schema schema = sf.newSchema(new Source[] { new StreamSource(xsdStream1), new StreamSource(xsdStream2), 
       new StreamSource(xsdStream3)); 
} 

// This part should be done for each document. 
Marshaller marshaller = getJaxbContext().createMarshaller(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); 
marshaller.setSchema(schema); 
marshaller.marshal(jaxbRootElement, whereTheOutputIsGoing); 

注意。一般に、各文書に対して新しいマーシャラーを作成する必要があります。

+0

を追加しました。これは私が探しているものです。魅力のように働いた。ありがとうございました !!! – PKR

関連する問題