4

私は現在、XMLSerializer を使用して XSD 検証を実行し、ファイル内の検証エラーを収集することと戦っています。タスクは、値セット情報、プレゼンス情報などを含むカスタム XSD に基づくファイルの検証です。

私の問題は次のとおりです。XMLReader を使用する場合、(XMLReaderSettings を介して) リーダーの ValidationEvents にリスナーをアタッチすると、最初のエラーで停止します。したがって、エラーをログに記録する例外をキャッチするだけです。これまでのところすべて問題ありませんが、例外をログに記録した後に問題が発生し始めます。その直後、XMLReader は失敗したフィールドの終了タグに移動しますが、原因不明の例外により次のフィールドを検証できません。

実際に実行するために、例外をキャッチするコードを次に示します。

  private bool TryDeserialize(XmlSerializer ser, XmlReader read,out object item)
  {
     string Itemname = read.Name;
     XmlReader read2 = read.ReadSubtree();
     try
     {
         item= ser.Deserialize(read2);
        return true;
     }
     catch (Exception e)
     {
        _ErrorList.Add("XSD error at " + Itemname + ": " + e.InnerException.Message);
        item = null;
        return false;
     }

  }

このルーチンはうまく機能しますが、次の処理に問題があります。次の XML スニペットをこのコードに渡すとします。

      <a>2885</a>
  <b>ABC</b>
  <c>5</c>

'b' の値が 'ABC' でない可能性があると仮定すると、XSD エラーが発生します。これが終わると、xmlreader は 'EndElement, Name=b' になり、例外が発生しない限りそこから移動することはできません。xmlreader.read を実行すると、次の例外が発生します (名前空間をここで削除します)。

"e = {"The element 'urn:iso:.....b' cannot contain child element 'urn:iso:.....:c' because the parent element's content model is text only."}"

この後、xmlreader は 'Element, Name=c' にあるので良さそうですが、上記のコードで逆シリアル化しようとすると、次の例外が発生します。

'_message = "The transition from the 'ValidateElement' method to the 'ValidateText' method is not allowed."'

どうすればそれを乗り越えられるか本当にわかりません。サブツリーを読み取る2番目のリーダーなしで試しましたが、同じ問題があります。私に何か提案してください、私は本当に立ち往生しています。よろしくお願いします!

あいさつ

4

1 に答える 1

0

次のことを考慮する必要がある場合があります。

  • 一般に、すべてのエラーを「収集」できるとは限りません。これは、特定の種類のエラーが発生した場合、特にバリデーターを確実に回復できない状態にした場合に、検証パーサーが検証プロセスを自由に放棄できるためです。 . たとえば、バリデーターは、単純型の制約ファセット違反に遭遇した後も続行できますが、予期しないコンテンツで実行された場合、セクション全体をスキップします。

  • DOM への解析とは異なり、DOM の読み込みはバリデーション リーダーが検証に失敗しても影響を受けません。オブジェクトへの逆シリアル化は (または少なくともそうあるべきです) まったく異なります。逆シリアル化、つまり強い型付けとは有効であることです。

直観的には、検証エラーが発生した場合、デシリアライゼーションとさらなる検証を続行する意味は何だと思いますか?

逆シリアル化とは別に XML を検証してみてください。実際にこのアプローチでフラグが立てられたエラーがさらに発生する場合は、上記でその理由を説明する必要があります。そうでない場合は、別の何かを追いかけています。

于 2012-10-24T18:12:48.233 に答える