我们目前使用.NET DataSet.ReadXmlSchema()函数将XML架构转换为关系结构。到目前为止,这对我们来说很好。我们的客户向我们提供了一个似乎可以转换的XSD,直到我们注意到生成的DataSet中缺少某些字段。
我已经创建了这个XSD的简化版本:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Document" type="Document"/>
<xs:complexType name="Document">
<xs:sequence>
<xs:element name="Customer" maxOccurs="100" minOccurs="0" type="Person"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="PersonIdentifier">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="1" name="CompositePersonId1" type="xs:integer"/>
<xs:element maxOccurs="1" minOccurs="1" name="CompositePersonId2" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="LocationIdentifier">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="1" name="CompositeLocationId1" type="xs:integer"/>
<xs:element maxOccurs="1" minOccurs="1" name="CompositeLocationId2" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Person">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" name="Id" type="PersonIdentifier"/>
<xs:element maxOccurs="1" minOccurs="0" name="Name" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="0" name="SurName" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="0" name="Age" type="xs:integer"/>
<xs:element maxOccurs="1" minOccurs="0" name="HouseAddress" type="Address"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Address">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" name="Id" type="LocationIdentifier"/>
<xs:element maxOccurs="1" minOccurs="0" name="Street" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="0" name="HouseNo" type="xs:integer"/>
<xs:element maxOccurs="1" minOccurs="0" name="HouseNoAd" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="0" name="City" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
DataSet接受这个架构,乍一看似乎都没问题。当我们将这些结构转换为实际的SQL表(不要问......)时,问题就变得很明显了:
create table Document(
Document_Id INT NULL
);
create table Customer(
Name VARCHAR(100) NULL,
SurName VARCHAR(100) NULL,
Age INT NULL,
Customer_Id INT NULL,
Document_Id INT NULL
);
create table Id(
CompositePersonId1 INT NULL,
CompositePersonId2 INT NULL,
HouseAddress_Id INT NULL,
Customer_Id INT NULL
);
create table HouseAddress(
Street VARCHAR(100) NULL,
HouseNo INT NULL,
HouseNoAd VARCHAR(10) NULL,
City VARCHAR(100) NULL,
HouseAddress_Id INT NULL,
Customer_Id INT NULL
);
DataSet为Person的Id字段创建了一个单独的表,因为它是ComplexType(PersonIdentifier)。它没有为Address的Id字段这样做,它是一个名为LocationIdentifier的ComplexType。相反,DataSet假定Person和Address的Id字段属于同一类型,并且它已将Address链接到同一Id表。
这样做的最终结果是在结果数据结构中找不到CompositeLocationId1和CompositeLocationId2字段。这对我们来说是个问题,因为我们依赖于这个功能。
为了清楚起见,编辑XSD不是一个选项,因为它是由客户提供的。客户不太可能编辑他的XSD,因为它是由主要的第三方提供的。
除了寻找DataSet功能的替代方案或自己构建一些东西之外,我基本上没有其他选择。