我有一個C#的Windows服務,定期從Web服務中提取XML並將數據存儲在數據庫表中。正確的方法來處理不良的XML數據
不幸的是,它的失敗是因爲Web服務偶爾會有不良數據 - 字符串而不是小數。我無法控制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)。
我使用的是驗證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()和更新()荷蘭國際集團的數據集。
每當碰到壞的數據,我得到以下異常:
System.Xml.Schema.XmlSchemaValidationException 了未處理
消息=「該 'COL1' 元素是無效的 - 值' A40' 根據其數據類型無效 'http://www.w3.org/2001/XMLSchema:decimal' - 字符串'A40'不是有效的Decimal值。「
我可以想辦法解決這個問題的幾種方法,但他們都覺得有點混亂,我想學習更優雅的東西,並提高我的知識。以下是我到目前爲止所提供的內容:
- 在加載到驗證XML閱讀器之前預先處理Web服務提供的XML,完全刪除任何錯誤的節點。
- 捕獲XmlSchemaValidationExceptions並嘗試從其中正常繼續(不太確定那個)
- 不要使用驗證XML讀取器,而是在將未驗證的xml加載到數據集時捕獲異常。 (再次不確定)
- 在數據集中包含字符串列,並忽略壞數據直到我更新它,並捕獲數據庫拒絕的任何內容。
- 去一個大木槌的用戶,直到他們學會第一次正確(太耗費時間)
- 別的東西?
UPDATE:的數據可以是壞的,因爲它來自於不確認COL1的用戶輸入的應用程序 - 但在COL2號碼是否正確計算,COL1應該用不同的系統相對應。任何無效的條目都應該被記錄下來,以便糾正。將數據寫入數據庫之後,另一個系統驗證COL1是否有效,如果在另一個系統中無法正確顯示,則用戶很快就會發現 - 無論如何,它們都用手裝載它:)
這只是一個臨時的解決方法,直到我找出噴水滅火系統的API – 2008-10-30 17:21:29