DataSet错误地解释具有重复元素名称的XSD

时间:2014-12-12 13:24:16

标签: c# .net xml xsd dataset

我们目前使用.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功能的替代方案或自己构建一些东西之外,我基本上没有其他选择。

0 个答案:

没有答案