1

このスキーマ(zip内)に対してXMLファイルを検証したい。他の2つのXSDファイルをインポートします。

   <import namespace="http://www.w3.org/2000/09/xmldsig#" 
       schemaLocation="xmldsig-core-schema.xsd"/>
   <import namespace="http://www.w3.org/2001/04/xmlenc#" 
       schemaLocation="xenc-schema.xsd"/>

2つのファイルもここから入手できます。

検証時に、次のエラーが発生します。

Src-resolve: Cannot Resolve The Name 'xenc:EncryptedData' To A(n) 'element Declaration' Component.

私の検証/アンマーシャリングコードは次のようになります(JAXBプロバイダーとしてmoxyを使用):

jaxbContext = JAXBContext.newInstance(type.getRequestType().getPackage().getName());
Unmarshaller um = jaxbContext.createUnmarshaller();

SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new StreamSource(this.getClass().getResourceAsStream("/xsd/" + type.getXsdName())));
um.setSchema(schema);

root = um.unmarshal(new StreamSource(new ByteArrayInputStream(xmlData)), type.getRequestType());

タイプが何をするかを尋ねる前に:私はhttp://www.forum-datenaustausch.ch/からすべてのタイプの請求書をインポートできるコードを書きました。ただし、バージョン4.3以降では、2つの追加スキーマファイルが使用されます。XMLファイルをどのように検証できますか?

4

2 に答える 2

5

この投稿で受け入れられた回答をご覧ください。私があなたの投稿で見ることができる小さなことに基づいて、そして私が覚えていることから、XSDをロードする方法の問題は、それをあなたの方法で行うと、工場がベースURIを取得しないという事実に関係していますしたがって、他の2つのXSDへの参照を解決するためにそのスマートを適用することはできません。他の2つのXSDも、同じディレクトリの同じjarにリソースとしてパックされていると想定する必要があります。

ロードしたスキーマが有効であることを示唆しているように見えるエラーメッセージに興味を持っていることを認めなければならないので、XMLの問題である可能性があります。上記が役に立たない場合は、問題のあるXMLも投稿することを検討してください...

更新:私のコメントによると、それは説明されているように機能しています。以下のコードスニペットを参照してください。

SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema compiledSchema = schemaFactory.newSchema(new SOTests().getClass()
    .getClassLoader().getResource("generalInvoiceRequest_430.xsd"));
Validator validator = compiledSchema.newValidator();
try {
    validator.validate(new StreamSource("D:\\...\\dentist_ersred_TG_430.xml"));
    System.out.println("Valid.");
}
catch (SAXException ex) {
    System.out.print("Not valid because..." + ex.getMessage());
}  

すべてのインポートがスキーマの場所へのヒントを提供するため、最初のXSDより多くをロードする必要はありません。ロードする必要もありません。

ここに画像の説明を入力してください

XSDファイルはすべて生成されたjar内の同じディレクトリにあり、インポートに使用される相対URIは同じ親を示しているため、そうである必要があります。

ここに画像の説明を入力してください

ここからダウンロードしたファイルの1つを含むプログラム出力:

Valid.

そして、無効なコンテンツを導入した後:

Not valid because...cvc-complex-type.2.4.a: Invalid content was found starting with element 'wrong'. One of '{"http://www.forum-datenaustausch.ch/invoice":processing}' is expected.

これを読む人への私の推奨事項:

  • getResource()を使用してURLを取得します。上で述べたように、StreamResourceにはベースURIがないため、xsd:importschemaLocation属性による相対参照を逆参照することはできません。
  • 明示的に提供されている場合は、スキーマ/ファクトリにロードを任せます。
  • 提供された場合、相対参照がjarファイルのフォルダー構造と一致することを確認してください。
于 2013-03-25T18:12:29.220 に答える
-1

ここで同様の問題。GeneralInvoiceを統合ソフトウェアにインポートしようとしました。

  1. パーサーは、インポートスキーマの開始時にDOCTYPEタグが気に入らなかった。DOCTYPE解決策:セクションを削除しました。
  2. パーサーはanyAttribute、anyURIなどをlkeしませんでした。解決策:anyURIを文字列に変更し、コメントを付けて他のものを削除しました。
  3. 最初にxencとxwldsigxsdをインポートしてから、2番目のステップでGeneralInvoiceをインポートする必要がありました。

お役に立てれば

于 2013-11-05T08:38:40.277 に答える