私は現在、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番目のリーダーなしで試しましたが、同じ問題があります。私に何か提案してください、私は本当に立ち往生しています。よろしくお願いします!
あいさつ