正确的方法来处理不良的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进行预处理,完全删除任何坏节点。
这是我选择的选项,它可以让你在异常之前抓住坏的输入并将它存储在某个地方,以便稍后查看。然后,你可以找到有问题的用户,并使用其它的你的方法
去站在了用户一个 大槌,直到他们学会得到 它第一次就
这个问题对我来说是:你想对错误数据做什么? 你想忽略它,消毒(从'A40'中删除'A'),或者收集它到一天,最后显示给用户(说到一个大木槌;-)?
如果您只是想排除任何有错误数据的行,那么在做其他事情之前,将带错误的行删除。如果在将其输入数据库之前仍需验证剩余的xml,则必须自行决定。如果以限制性方式进行剥离,则不再需要。
我已经澄清了这个问题。我开始认为预处理XML可能会是答案。 – 2008-10-30 17:06:32
如果只是偶尔,我可能会缓存最后一个已知的好结果,并完全忽略任何错误的提要。 (也许会注册一个警告。)我尽量避免尝试纠正错误的Feed。如果它甚至对模式无效,谁来说实际数据是正确的。
此外,您应该明确地提出与饲料提供商的问题,试图让他们纠正这个问题。
本身不错的饲料; COL1中的数据有时会输入错误,但不会被纠正,除非用户被警告,并且COL2可以在此之前更新多次。我不确定非验证应用程序的供应商仍然存在:( – 2008-10-30 17:25:17
这只是一个临时的解决方法,直到我找出喷水灭火系统的API – 2008-10-30 17:21:29