Web サービスから定期的に xml を取得し、データをデータベース テーブルに格納する小さな C# Windows サービスがあります。
残念ながら、Web サービスには時折不良データ (10 進数ではなく文字列) が含まれているため、失敗しています。Web サービスを制御することはできません (ソフトウェアからの検証されていないユーザー入力は変更できません) が、再入力できるように不良データをログに記録したいと考えています。
次のような単純なデータです。
<ROWS>
<ROW>
<COL1>5405</COL1>
<COL2>102.24</COL1>
</ROW>
<ROW>
<COL1>5406</COL1>
<COL2>2.25</COL1>
</ROW>
</ROWS>
このテーブルには、COL1 (NUMBER, 10)、COL2 (NUMBER, 10,2) の 2 つの列しかありません。
私は検証用の XmlReader とこの XSD を使用していました。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ROWS" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="ROWS" msdata:IsDataSet="true" msdata:Locale="en-US">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="ROW">
<xs:complexType>
<xs:sequence>
<xs:element name="COL1" type="xs:decimal" minOccurs="0" />
<xs:element name="COL2" type="xs:decimal" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
次に、データセットを dataset.ReadXml() および Update() します。
悪いデータにヒットするたびに、次の例外が発生します。
System.Xml.Schema.XmlSchemaValidationException が処理されませんでした
Message="'COL1' 要素が無効です - データ型 ' http://www.w3.org/2001/XMLSchema:decimal 'によると、値 'A40' は無効です' - 文字列 'A40' は有効な Decimal ではありません価値。"
この問題を回避する方法はいくつか考えられますが、それらはすべて少し面倒に感じます。もっと洗練された方法を学び、知識を向上させたいと思っています。これが私がこれまでに思いついたものです:
- 検証用 XML リーダーにロードする前に、Web サービスによって提供された XML を前処理し、不良ノードを完全に削除します。
- XmlSchemaValidationExceptions をキャッチし、それらから正常に続行しようとします (それについてはわかりません)。
- 検証 XML リーダーを使用しないでください。代わりに、検証されていない xml をデータセットに読み込むときに例外をキャッチします。(これもよくわからない)
- データセットに文字列列があり、更新するまで不良データを無視し、データベースが拒否したものをすべてキャッチします。
- ユーザーが最初にそれを正しく理解できるようになるまで、大きなマレットを持ってユーザーの上に立ちます (時間がかかりすぎます)。
- 他の何か?
更新: COL1 のユーザー入力を検証しないアプリケーションからデータが取得されるため、データが正しくない可能性がありますが、COL2 の数値は正しく計算され、COL1 は別のシステムに対応するはずです。無効なエントリは、修正できるように記録する必要があります。データがデータベースに書き込まれた後、別のシステムが COL1 が有効であることを確認し、ユーザーは他のシステムで正しく表示されない場合にすぐに気付くでしょう - とにかく手動でロードしていました :)