如果你开发一个用XML来进行数据交换的应用程序,那么它可能需要在多种操作系统上运行,并需要与若干其它应用程序相交互。最近,我接手了一个项目,该项目的目标就是开发一个用于处理来自各种途径的XML文件,并把它们存储到SQL Server数据库的系统。
由于XML文件来源很多很杂,因此需要用XML Schema来验证XML文件的有效性。Schema定义了许多标准,包括XML Schema标准“日期”类型格式(YYYY-MM-DD)。在项目开发进入尾声阶段时,我的同事认为我们应该把时间附加到所有的日期字段(date
field)中。
这个变动发生在我开始执行性能测试时。不幸的是,性能测试所用到的XML文件有一部分没有在日期字段中包含时间。只有一部分XML文件符合新的XML Schema。XML
Schema非常严格,因此任何没有包括时间的XML文件在执行测试时都是无效而不可用的。由于我是在开始执行测试的十分钟之前才发现这个问题的,因此想立即得到一组正确的XML文件几乎就是不可能的。
我的解决方法就是在XML Schema中修改日期元素的simpleType定义,使其包含UNION定义。UNION定义允许在一个元素中使用多个基类型(base
type)。这就允许我更新XML Schema,让它即接受date字段也接受dateTime字段。下面是一个元素的例子:
<element
name="dateCreated">
<simpleType>
<union>
<simpleType>
<restriction base="date">
</restriction>
</simpleType>
<simpleType>
<restriction base="dateTime">
</restriction>
</simpleType>
</union>
</simpleType>
</element>
注意上面的例子中的UNION定义中的基类型(date和datetTime类型)都有同样的导出类型。不过使用UNION类型并不要求这一点,你可以在一个UNION定义中使用基类型的任何一种组合。
然而,如果你用验证后的XML文件中的数据来更新后端数据库,那么最好在UNION定义中使用来自相同导出类的基类型。如果你让同一个字段即使用字符又使用整型数据类型,而这个字段又是用来更新SQL Server数据库的整型字段,那么就会导致严重的问题。
本文作者Mark Peterson,计算机硕士,是Tek系统的顾问。他还开发了各种类型的Web站点,包括电子商务网站和企业内部网。