这是对我的comment 的跟进;我不是将其定位为答案,但它应该可以帮助您更多地了解您所追求的目标,以及您可以做些什么。当然,这应该是@a_horse_with_no_name 的一个很好的例子......
我不熟悉 xmlspy,但鉴于我在 xsd2db 中看到的内容,它让我想到了 .NET 从 XML Schema 推断 DataSet 的能力。虽然authoring style of the XSD itself may affect the way a DataSet is derived,但对于较大的 XSD 主体而言,它几乎是微不足道的。更重要的是,推导很有可能甚至不起作用(实际上有很多限制)。
根据我自己的经验,.NET 中的派生过程为您提供了一个非常规范化的结构。为了说明,我将介绍一个示例 XML:
<ShippingManifest>
<Date>2012-11-21</Date>
<InvoiceNumber>123ABC</InvoiceNumber>
<Customer>
<FirstName>Sample</FirstName>
<LastName>Customer</LastName>
</Customer>
<Address>
<UnitNumber>2A</UnitNumber>
<StreetNumber>123</StreetNumber>
<StreetName>A Street</StreetName>
<Municipality>Toronto</Municipality>
<ProvinceCode>ON</ProvinceCode>
<PostalCode>X9X 9X9</PostalCode>
</Address>
<PackingList>
<LineItem>
<ID>Box1</ID>
<Load>1-233</Load>
<Description>Package box</Description>
<Items>22</Items>
<Cartons>22</Cartons>
<Weight>220</Weight>
<Length>10</Length>
<Width>10</Width>
<Height>10</Height>
<Volume>1000</Volume>
</LineItem>
<LineItem>
<ID>Box2</ID>
<Load>456-233</Load>
<Description>Package box</Description>
<Items>22</Items>
<Cartons>22</Cartons>
<Weight>220</Weight>
<Length>10</Length>
<Width>10</Width>
<Height>10</Height>
<Volume>1000</Volume>
</LineItem>
</PackingList>
</ShippingManifest>
从概念上讲,它的结构非常简单:发货清单实体、客户、发货地址和装箱单。
将其转换为 ADO.NET 数据集是一个简单的练习,输出非常干净。
应该很容易想象实体(如果您愿意,可以在您的数据库中的表)的数量会如何增加一点更复杂的 XML...
作为侧边栏,如果设计 XSD 时要牢记涉及数据集的过程,则删除 PackingList 元素并将 LineItem 集合移动为在 下重复ShippingManifest 提供了一种稍微简化的布局:没有 PackingList 实体。
用于将 XSD 数据模型转换为关系模型(例如 .NET)的自动工具通常用于生成高度规范化的结构。出于显而易见的原因,我想非规范化留给用户。
QTAssistant 的 XML Builder 不同。我们的要求是创建一个 ER 模型,该模型可以在 .NET 的 XSD 到数据集无法使用的地方工作,并且在可能的情况下输出包含较少数量的实体。这是 QTAssistant 生成的相同内容:
QTAssistant 在这里所做的是合并所有参与一对一关系的实体。从建模的角度来看,这是一个明显的罪过。它确实有它的好处,特别是对于我们对能够捕获数据的简单结构感兴趣的用户(更具体的测试数据)。
生成的映射(XSD 到 ER)是双向的。这意味着它可以用于从数据库生成有效的 XML,或者将 XML 数据“分解”到数据库中(分解是通过生成 DML 语句来完成的)。该技术的使用方式:测试用例存储在 Excel 电子表格中,生成 XML,发送到 Web 服务,然后将结果存储回 Excel。
我们还生成一个 XML 文件来描述可以通过 XSLT 转换为 DDL 的结构。这就是事情可能会变得混乱的地方,具体取决于您的架构。简单类型不受限制的 XSD 很常见:没有最大长度的字符串,或者使用没有最大长度的模式;无约束的小数等。这些只是为什么在我们的例子中,我们没有开箱即用的直接方式来生成 DDL,而是提供自定义挂钩。
所以,结束我的评论,我几乎知道你想做什么(我必须假设其他事情,如 Oracle 的 XML 功能,或 XML 数据库和 XQuery 等已被排除)。不幸的是,XSD 在这里真的很重要,所以如果你可以按照我的评论分享这些内容,我可以看看 - 你想在这里分享多少取决于你。