4

xmlをWebページに送信しましたが、ファイルが検証されるまで、いくつかのxsdに対して検証したいと思います。検証すると、どのスキーマが検証したかに基づいてxmlファイルのタイプを判別できなくなります。

  List<string> xsdList = new List<string>();

  xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Enquiry.xsd");
  xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\FingerDeleted.xsd");
  xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Heartbeat.xsd");
  xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Validation.xsd");

  XmlSchemaSet schemas = new XmlSchemaSet();

  foreach (string schema in xsdList)
  {
    var reader = new StringReader(File.ReadAllText(schema));
    schemas.Add("", XmlReader.Create(reader));
  }

  request.Validate(schemas, (o, e) =>
  {
    match = false;
  });

誰もが助けることができます、上記はこれまでのところ一緒に石畳になっているものです、それは現在エラーをスローします'System.Xml.Schema.XmlSchemaValidationException:グローバル要素'インターフェイス'はすでに宣言されています'

どのスキーマ検証が成功したかを返す方法はありますか?

4

2 に答える 2

4

まず、どのXSDファイルをファイルセットにまとめることができるかを理解する必要があります。発生しているエラーは、同じ要素'interface'に2つ以上の異なるベースURIからの定義があることを示しています。

セットを動的に決定したい場合は、少し作業が必要です。それは可能ですが、それは些細なことではありません。XSDファイルが構成(インクルード/インポート/再定義)を使用するかどうかによって異なります。そうでない場合(簡単なシナリオ)、XSDファイルをまとめるには、各XSDファイルを個別にロードし、グローバルに定義されたすべてのコンテンツ(タイプ、要素、グループ、属性、属性グループ)のインデックスを作成してから、セット内のそれらを一緒にすると、セットの個々のXSDメンバーの任意のペアが与えられると、交差セットは空になります。セットを構築するための戦略は、多くの要因に依存します。パフォーマンスとカバレッジは2つだけです。この些細なケースに基づいて、交差点が空でない場合でも、構成がどのように重要になるかを確認できます。

QTAssistant(私はそれに関連付けられています)は、分析、検証などのために任意のXSDコンテンツを「収集」するときに、XMLスキーマリファクタリングエンジンのXMLスキーマソースセット(またはコレクション)をセットアップするために、上記を処理するエンジン全体を持っています。

セットを理解したら、それらのスキーマの構成に対して仮定を立てる必要があります。つまり、有効なXMLドキュメント要素のセットを構成するもの(すべてのグローバル要素定義が有効なドキュメント要素であるとは限らない場合があります)、および各ドキュメント要素に使用されることになっているスキーマセット。要素が重複しているので、どうにかしてこれに対処しなければならないことは明らかです。

質問に従って処理する場合は、上記のように構築されたスキーマセットのセットをループするだけです。

最適なセットを手動で見つける方法に関する戦略を考え出すための最良の方法は、XSDファイル間の関係を視覚化することかもしれません。以下は、SOに関する別の投稿から、利用可能なツールを使用してどのように表示されるかを示しています。

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

于 2013-03-26T13:20:45.510 に答える
1

http://msdn.microsoft.com/en-us/library/fe6y1sfe(v=vs.110).aspxから:

「XmlSchemaSetのスキーマは、XmlSchemaSetのCompileメソッドによって1つの論理スキーマにコンパイルされます。」

したがって、いくつかの個別のスキーマに対して検証するにはXmlSchemaSet、XSDごとにを作成する必要があります。

次に、次のようなことを行うことができます。

bool xmlIsValid = true;
XmlSchemaSet validatingSchema;
foreach (XmlSchemaSet schema in schemas) {
    xml.Validate(schema, (o, e) => { xmlIsValid = false; });
    if (xmlIsValid) {
        validatingSchema = schema;
        break;
    }
}
于 2014-01-08T02:58:25.173 に答える