2008-10-30 83 views
2

我有一個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是否有效,如果在另一個系統中無法正確顯示,則用戶很快就會發現 - 無論如何,它們都用手裝載它:)

回答

3

在加載到驗證XML閱讀器的 之前,對 Web服務提供的XML進行預處理,完全刪除任何壞節點。

這是我選擇的選項,它可以讓你在異常之前抓住壞的輸入並將它存儲在某個地方,以便稍後查看。然後,你可以找到有問題的用戶,並使用其它的你的方法

去站在了用戶一個 大槌,直到他們學會得到 它第一次就

+0

這只是一個臨時的解決方法,直到我找出噴水滅火系統的API – 2008-10-30 17:21:29

0

這個問題對我來說是:你想對錯誤數據做什麼? 你想忽略它,消毒(從'A40'中刪除'A'),或者收集它到一天,最後顯示給用戶(說到一個大木槌;-)?

如果您只是想排除任何有錯誤數據的行,那麼在做其他事情之前,將帶錯誤的行刪除。如果在將其輸入數據庫之前仍需驗證剩餘的xml,則必須自行決定。如果以限制性方式進行剝離,則不再需要。

+0

我已經澄清了這個問題。我開始認爲預處理XML可能會是答案。 – 2008-10-30 17:06:32

0

如果只是偶爾,我可能會緩存最後一個已知的好結果,並完全忽略任何錯誤的提要。 (也許會註冊一個警告。)我儘量避免嘗試糾正錯誤的Feed。如果它甚至對模式無效,誰來說實際數據是正確的。

此外,您應該明確地提出與飼料提供商的問題,試圖讓他們糾正這個問題。

+0

本身不錯的飼料; COL1中的數據有時會輸入錯誤,但不會被糾正,除非用戶被警告,並且COL2可以在此之前更新多次。我不確定非驗證應用程序的供應商仍然存在:( – 2008-10-30 17:25:17

相關問題