2011-12-27 38 views
2

XSDファイル(XMLではありません)を検証します。私が使用しているアプローチは、他のXMLファイルとしてXSDを扱い、このwww.w3.org/2001/XMLSchema.xsdをスキーマとして使用することです。XSDファイルを検証する

私は、次のコードを使用しています:

String schemaLang = "http://www.w3.org/2001/XMLSchema"; 
SchemaFactory factory = SchemaFactory.newInstance(schemaLang); 
Schema schema = factory.newSchema(new StreamSource("C:\\Users\\aprasad\\Desktop\\XMLSchema.xsd")); 
Validator validator = schema.newValidator();   
validator.validate(new StreamSource("shiporder.xsd")); 

をしかし、私は次のエラーを取得しています:

Failed to read schema document 'XMLSchema.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema> .

ないファイルパスが正しいようなエラーが何であるかを確認してください。

XSDファイルを検証する正しい方法を教えてください。

+1

あなたの問題はあなたのスキーマの検証ではありません。エラーメッセージが示すように、あなたのプログラムは 'XMLSchema.xsd'を読むことができません。それは自分のスキーマを検証することではありません。プログラムの最初の3行は、次の2行について心配する前に修正する必要があります。あなたの 'shiporder.xsd'スキーマは質問には関係ありません。 – skaffman

+0

@skaffman - 最初の3行でどのような修正が必要か教えてください。コード@ java2s.com – Anand

+0

スキーマを読む限り、スキーマはw3cからダウンロードされ、それ以降は変更されません。 – Anand

答えて

1

XMLSchema.xsdのすぐ隣に2つの追加ファイルが必要です。これらは次のとおりである:

XMLSchema.xsd参照これらの2つのファイル。

右横に、そうXMLSchema.xsdC:/XMLSchema.xsdに配置されている場合、あなたはC:/XMLSchema.dtdC:/datatypes.dtdを持っている必要があります。

SchemaFactoryインスタンスは、デフォルトでXMLCatalogResolverというLSResourceResolverという内部クラスを使用します(SchemaFactory.setResourceResolver(LSResourceResolver)を参照)。前者は、リファラーの横の参照ファイルを探します。

あなたが本当にハード見れば、あなたのSAXParseExceptionの原因は、システムがXMLSchema.dtdファイルを見つけることができなかったと言うことFileNotFoundExceptionです。

これ以外のコードはOKです(スキーマもあります)。

0

javadoc for the StreamSource classによれば、Stringを取るコンストラクタメソッドを使用する場合、その文字列は有効なURIである必要があります。たとえば、ローカルファイルを参照しようとしている場合は、パスの先頭にfile:/という接頭語を付ける必要があります。要約すると

Schema schema = factory.newSchema(new File(new StreamSource("C:\\Users\\aprasad\\Desktop\\XMLSchema.xsd"))); 

が、例えば、あなたのプログラムが必要なファイルが見つからないによって引き起こされる問題を除外するためにいくつかの簡単なテストを行うことが、この場合において有益である:別の方法として、あなたは、コンストラクタにFileオブジェクトを渡すことができます

File schemaFile1 = new File("C:\\Users\\aprasad\\Desktop\\XMLSchema.xsd"); 
File schemaFile2 = new File("shiporder.xsd"); 
assert schemaFile1.exists(); 
assert schemaFile2.exists(); 
+0

ファイルが存在する場合、 'File'または' StreamSource'を 'file:// 'と一緒に、または使用せずに使用することは重要ではありません。参照されているファイルがありません。 –

0

私はあなたが達成しようとしているのだろうか? factory.newSchema(X)が例外をスローしない場合、Xは有効なスキーマ(*)でなければなりません。これは、スキーマ文書のスキーマを検証するよりはるかに簡単なことです。

(*)逆は必ずしも当てはまるとは限りません.Xはスキーマ文書のスキーマに対して有効ですが、UPA制約違反などの理由で無効になることがあります。

+0

私の答えに基づいて私は少しテストをしました。 'XMLSchema.xsd'をロードして' Schema'を作成し、それを検証しました。マシンの平均負荷は30.76秒で、検証には232.3ミリ秒かかりました。 OPで_heavy_スキーマファイルの検証をしたいと仮定すると、XMLファイルのXMLスキーマをメモリに読み込んでファイルを検証するほうが、入力ファイルごとに新しいSchemaを作成する方が良いでしょう。 –