【发布时间】:2010-09-20 00:49:03
【问题描述】:
我有一个小的 c# windows 服务,它定期从 web 服务中提取 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() 和 Update()ing 数据集。
每当遇到错误数据时,我都会收到以下异常:
System.Xml.Schema.XmlSchemaValidationException 未处理
Message="'COL1' 元素无效 - 值“A40” 根据其数据类型无效 'http://www.w3.org/2001/XMLSchema:decimal' - 字符串 'A40' 不是有效的十进制值。"
我可以想出几种方法来解决这个问题,但它们都感觉有点杂乱无章,我想学习一些更优雅的东西,并提高我的知识。到目前为止,这是我想出的:
- 在加载到验证 XML 阅读器之前对 Web 服务提供的 XML 进行预处理,从而完全删除所有坏节点。
- 捕获 XmlSchemaValidationExceptions 并尝试从它们优雅地继续(不确定那个)
- 不要使用验证 XML 阅读器,而是在将未经验证的 xml 加载到数据集时捕获异常。 (再次不确定)
- 在数据集中有字符串列,在我更新之前忽略错误数据,并捕获数据库拒绝的任何内容。
- 用大木槌站在用户面前,直到他们学会第一次就正确(太耗时)
- 还有别的吗?
更新:数据可能很糟糕,因为它来自不验证 COL1 的用户输入的应用程序 - 但 COL2 中的数字计算正确,COL1 应该对应于不同的系统。应记录任何无效条目,以便更正。数据写入数据库后,另一个系统会验证 COL1 是否有效,如果它在另一个系统中显示不正确,用户很快就会发现 - 他们过去常常手动加载它:)
【问题讨论】:
标签: c# xml xsd xmlreader xmlschemaset