2

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 が有効であることを確認し、ユーザーは他のシステムで正しく表示されない場合にすぐに気付くでしょう - とにかく手動でロードしていました :)

4

3 に答える 3

3

検証用 XML リーダーにロードする前に、Web サービスによって提供された XML を前処理し、不良ノードを完全に削除します。

これは私が選択するオプションです。これにより、例外の前に不正な入力を取得し、後で確認できるようにどこかに保存できます。次に、問題のあるユーザーを見つけて、別の方法を使用できます

ユーザーが最初にそれを正しく理解できるようになるまで、大きなマレットでユーザーの上に立ってください。

于 2008-10-30T16:39:51.617 に答える
0

私への質問は次のとおりです。誤ったデータで何をしたいですか? それを無視するか、サニタイズ (「A40」から「A」を削除) しますか、それとも収集して最終的にユーザーに表示しますか (大きな木槌について言えば;-) ?

間違ったデータを含む行を除外したいだけの場合は、他の操作を行う前に、エラーのある行を削除してください。残りの xml を DB に入力する前に検証する必要があるかどうかを判断する必要があります。制限的な方法でストリッピングを行う場合、ストリッピングは不要になるはずです。

于 2008-10-30T16:45:07.470 に答える
0

たまにしかない場合は、最後の既知の良い結果をキャッシュして、悪いフィードを完全に無視するでしょう。(おそらく警告をログに記録します。) 不適切なフィードを修正しようとすることは避けたいと思います。スキーマに対して有効でさえない場合、実際のデータが正しいと誰が言えますか。

また、必ずフィード プロバイダーに問題を提起して、問題を修正してもらう必要があります。

于 2008-10-30T16:46:18.390 に答える