我有很多不同复杂类型的 xsd 文件。我想将数据导入我的 oracle 数据库,但数据量如此之大,我无法使用 xsd2db 或 altova xmlspy,因为这让我大吃一惊。我正在寻找可以帮助我的简单实用的 etl 工具。有谁知道通过 xsd 生成 ddl 的 gui 工具?
1 回答
这是我评论的后续;我不是将其定位为答案,但它应该可以帮助您更多地了解您所追求的目标,以及您可以做些什么。当然,这应该是@a_horse_with_no_name 的一个很好的例子......
我不熟悉 xmlspy,但鉴于我在 xsd2db 中看到的内容,它让我想到了 .NET 从 XML Schema 推断 DataSet 的能力。虽然XSD 本身的创作风格可能会影响 DataSet 的派生方式,但对于较大的 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 时要牢记涉及 DataSet 的过程,则删除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 在这里真的很重要,所以如果你可以按照我的评论分享这些内容,我可以看看——这取决于你想在这里分享多少。