代码之家  ›  专栏  ›  技术社区  ›  Colin Pickard

处理错误XML数据的正确方法

  •  2
  • Colin Pickard  · 技术社区  · 16 年前

    我有一个小小的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>
    

    这个表只有两列,第一列(数字,10),第二列(数字,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()。

    每当它命中坏数据时,我会得到以下异常:

    system.xml.schema.xmlschemavalidationexception(系统.xml.schema.xmlschemavalidationexception) 未处理

    message=“第1列” 元素无效-值“A40” 根据其数据类型无效 ’ http://www.w3.org/2001/XMLSchema:decimal ’ -字符串“A40”不是有效的十进制值。“

    我可以想出几种解决问题的方法,但它们都有点笨拙,我想学习一些更优雅的东西,提高我的知识。以下是我到目前为止的想法:

    • 预处理Web服务提供的XML,然后将其加载到验证XML读卡器中,从而完全删除所有坏节点。
    • 捕获xmlschemavalidationExceptions并尝试从中优雅地继续(不确定该异常)
    • 不要使用验证XML读取器,而是在将未验证的XML加载到数据集中时捕获异常。(同样不确定)
    • 在数据集中有字符串列,在更新之前忽略坏数据,并捕获数据库拒绝的任何内容。
    • 用一把大木槌去和用户站在一起,直到他们第一次学会正确使用(太费时了)
    • 还有别的吗?

    更新: 数据可能不好,因为它来自一个不验证用户输入col1的应用程序-但是col2中的数字计算正确,col1应该与不同的系统对应。应记录所有无效条目,以便更正。将数据写入数据库后,另一个系统会验证col1是否有效,并且用户很快就会发现它是否在另一个系统中显示不正确-他们总是手工加载它:)

    3 回复  |  直到 16 年前
        1
  •  3
  •   Jeremy Reagan    16 年前

    预处理由提供的XML 在加载到 正在验证XML读取器,删除任何 完全是坏节点。

    这是我将要选择的选项,它将允许您在异常发生之前获取错误的输入,并将其存储在某个地方,以便稍后查看。然后您可以找到有问题的用户,并使用其他方法

    用一个 大木槌直到他们学会 这是第一次

        2
  •  0
  •   Treb    16 年前

    我的问题是:你想如何处理埃罗纽斯的数据? 您想忽略它,对其进行消毒(从“A40”中删除“A”),还是将其收集到某一天,最后向用户显示它(说到大木槌;-)?

    如果您只想删除任何包含错误数据的行,那么在执行其他操作之前,先删除包含错误的行。在将剩余的XML输入数据库之前,您必须决定是否仍需要验证它。如果您以限制性的方式进行剥离,那么就不再需要这样做了。

        3
  •  0
  •   C. Dragon 76    16 年前

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

    此外,您应该向订阅源提供商提出问题,试图让他们纠正该问题。

    推荐文章