1

スキーマのグループを使用して、受信した XML の断片に対して何らかの検証を実行する必要があります。

これらのスキーマはすべて同じ targetNamespace を共有しますが、異なる .xsd ファイルに分かれています。

私の Java プログラムは、各 xsd ファイルを InputSource[] 配列にロードし、それらを SAX パーサー (SCHEMA_SOURCE プロパティ) に渡します。ただし、XMLReader.parse メソッドを呼び出すと、次のスタック トレースが表示されます。

** java.lang.IllegalArgumentException: オブジェクトの配列を SCHEMA_SOURCE プロパティの値として使用する場合、2 つのスキーマが同じ targetNamespace を共有してはなりません。org.apache.xerces.impl.xs.XMLSchemaLoader.processJAXPSchemaSource (不明なソース) org.apache.xerces.impl.xs.XMLSchemaLoader.loadSchema (不明なソース) org.apache.xerces.impl.xs.XMLSchemaValidator.findSchemaGrammar (未知のソース) org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement (未知のソース) org.apache.xerces.impl.xs.XMLSchemaValidator.startElement (未知のソース) org.apache.xerces.impl.XMLNSDocumentScannerImpl org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook (不明なソース) の .scanStartElement (不明なソース) org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher で。

名前空間を共有するスキーマを使用して XML を解析する必要があります。これを実行して上記のエラーを回避することは可能ですか?

あらゆる形の助けやアドバイスをいただければ幸いです

ありがとう

4

1 に答える 1

0

いいえ、できません。これは、XML およびスキーマ仕様によって実施されます。

エンティティまたは属性は、暗黙的なデフォルトの名前空間か、接頭辞としての明示的な名前空間のいずれかの単一の名前空間にのみ関連付けることができます。

アドバイス: XML 入力が整形式であるが、名前空間が宣言されていないために検証できないが、前のノードやそのノードなどのコンテキストに基づいて各ノードの名前空間を推測できるロジックを実装する方法を知っている場合親ノード。プリプロセッサを作成できます:

  • スキーマ検証なしで、XML 入力ノードを DOM として (または SAXParser を使用して) 解析します。
  • そのようなロジックを適用し、推測された名前空間を持つエンティティや属性を前に追加します
  • XML として再度出力します。そのステップでは、必要に応じて、デバッグ目的でプリティ フォーマッタを使用できます。
  • スキーマ検証を使用して、その出力を既存のパーサーに挿入します
于 2012-02-15T12:03:19.153 に答える