0

特定の xsd ファイルと、このファイルの特定の例があります。xsd はhttp://www.forum-datenaustausch.ch/hospitalinvoicerequest_400.xsdと非常に似ていますが、ルートの下に 1 つの要素が追加されています。

問題は、指定された xml をスキーマに対して検証した場合 (moxy を JAXBCOntextFactory として使用)、次のエラーが発生したことです。

enterCaused by: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 221; cvc-elt.1: Cannot find the declaration of element 'invoice:request'.

Invoice:request は、xml が開始するルート要素です。

<invoice:request role="production" xmlns:invoice="http://www.medidata.ch/QO/XSD" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.medidata.ch/QO/XSD QO_MDInvoiceRequest_400.xsd">

オンラインまたはEclipse(右クリックで検証)でスキーマに対してxmlを検証すると、すべて正常に動作します。名前空間を

xmlns:invoice="http://www.medidata.ch/QO/XSD"

xmlns:invoice="http://www.xmlData.ch/xmlInvoice/XSD"

エラーは消えますが、要素が追加されたため、別のエラーが発生します。この名前空間宣言では、検証なしではコンテンツを読み取ることさえできません。ルートのゲッターは null を返します。代替宣言 (" http://www.xmlData.ch/xmlInvoice/XSD ") を使用し、検証なしですべて正常に動作します!

では、名前空間宣言の何が問題なのですか?

4

1 に答える 1

1

requestこのエラーは、ローカル名と名前空間プレフィックスを持つ要素の定義がないため、ドキュメントが無効であることを示していますinvoice。インスタンスドキュメントには、そのプレフィックスの名前空間バインディングと、同じ名前空間URIのスキーマ位置ヒントがあるため、その部分は正しいようです。

次の問題についてスキーマを確認してください。

  1. スキーマのターゲット名前空間は、ドキュメントのルート要素で使用されている名前空間と同じですか(ここhttp://www.medidata.ch/QO/XSD
  2. ルート要素と同じローカル名を持つ要素のグローバル要素宣言はありますか(ここrequest
  3. ルート要素が名前空間プレフィックスを使用してスキーマで宣言されている場合、そのプレフィックスはドキュメントで使用されているのと同じ名前空間URIにバインドされていますか?

これらのいずれかが正しくない場合、ドキュメントは無効です。(後でスキーマまたはインスタンスXMLドキュメントに他の問題が発生して無効になる可能性もあります。)

通常(XMLドキュメントが本当に有効な場合)、このような問題は次の2つの理由のいずれかが原因で発生します。

  1. スキーマドキュメントが見つかりません
  2. パーサーが名前空間を認識するように設定されていないため、要素名が誤って解釈されています

マークアップxsi:schemaLocation="http://www.medidata.ch/QO/XSD QO_MDInvoiceRequest_400.xsd"は、名前空間内の要素のスキーマがhttp://www.medidata.ch/QO/XSD相対(ファイル)の場所から検出されることを定義しますQO_MDInvoiceRequest_400.xsd。したがって、パーサーに使用するスキーマドキュメントを具体的に指定しない場合、パーサーは入力ドキュメントと同じフォルダーからその名前のファイルを検索します。

2番目の理由で、私はmoxyに精通していないため、良い助けを与えることができませんが、moxyは常にXMLファイルを名前空間対応として処理すると想定しています。

于 2013-03-14T16:44:51.590 に答える