正确的方法来处理不良的XML数据

问题描述:

我有一个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是否有效,如果在另一个系统中无法正确显示,则用户很快就会发现 - 无论如何,它们都用手装载它:)

在加载到验证XML阅读器的 之前,对 Web服务提供的XML进行预处理,完全删除任何坏节点。

这是我选择的选项,它可以让你在异常之前抓住坏的输入并将它存储在某个地方,以便稍后查看。然后,你可以找到有问题的用户,并使用其它的你的方法

去站在了用户一个 大槌,直到他们学会得到 它第一次就

+0

这只是一个临时的解决方法,直到我找出喷水灭火系统的API – 2008-10-30 17:21:29

这个问题对我来说是:你想对错误数据做什么? 你想忽略它,消毒(从'A40'中删除'A'),或者收集它到一天,最后显示给用户(说到一个大木槌;-)?

如果您只是想排除任何有错误数据的行,那么在做其他事情之前,将带错误的行删除。如果在将其输入数据库之前仍需验证剩余的xml,则必须自行决定。如果以限制性方式进行剥离,则不再需要。

+0

我已经澄清了这个问题。我开始认为预处理XML可能会是答案。 – 2008-10-30 17:06:32

如果只是偶尔,我可能会缓存最后一个已知的好结果,并完全忽略任何错误的提要。 (也许会注册一个警告。)我尽量避免尝试纠正错误的Feed。如果它甚至对模式无效,谁来说实际数据是正确的。

此外,您应该明确地提出与饲料提供商的问题,试图让他们纠正这个问题。

+0

本身不错的饲料; COL1中的数据有时会输入错误,但不会被纠正,除非用户被警告,并且COL2可以在此之前更新多次。我不确定非验证应用程序的供应商仍然存在:( – 2008-10-30 17:25:17