Reputation: 48758
I hope someone can help me. I'm very new at this. I was wondering if it's possible to get an XSD Schema to dump XML data into multiple SQL tables (using the sql:relation attribute
, etc.).
One table is proving no problems, so I just wondered if it's possible to dump data in two. It'd be nice to be able to do this with one XSD Schema, but do I have to make two passes on the XML for the second table?
Thanks for any assistance.
Here's the schema itself:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<!-- Skimlinks/Everyfeed schema -->
<!-- definition of simple elements -->
<xs:element name="title" type="xs:string" sql:field="ProductName"/>
<xs:element name="url" type="xs:string" sql:field="ProductURL"/>
<xs:element name="image_url" type="xs:string" sql:field="ImageURL"/>
<xs:element name="currency" type="xs:string" sql:field="currency"/>
<xs:element name="price" type="xs:string" sql:field="Price"/>
<xs:element name="merchant" type="xs:string" sql:field="Brand" default=" " />
<xs:element name="description" type="xs:string" sql:field="Description" default=" "/>
<xs:element name="item" type="xs:string" sql:field="Category" />
<!-- definition of attributes -->
<xs:attribute name="id" type="xs:string" sql:field="SKU" />
<!-- definition of complex elements -->
<xs:element name="category" sql:relation="ProductDataCategory">
<xs:complexType>
<xs:sequence>
<xs:element ref="item" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="product" sql:relation="ProductData">
<xs:complexType>
<xs:sequence>
<xs:element ref="title"/>
<xs:element ref="url"/>
<xs:element ref="image_url"/>
<xs:element ref="currency"/>
<xs:element ref="price"/>
<xs:element ref="merchant"/>
<xs:element ref="description"/>
<xs:element ref="category"/>
</xs:sequence>
<xs:attribute ref="id" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="products" sql:is-constant="1">
<xs:complexType>
<xs:sequence>
<xs:element ref="product" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="everyFeed" sql:is-constant="1">
<xs:complexType>
<xs:sequence>
<xs:element ref="products" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Here's an example of the XML we're importing:
<?xml version='1.0' encoding='utf-8'?>
<feed version="2">
<numFound>7985</numFound>
<products>
<product id="18639|216623247">
<title>Trouser</title>
<url>http://www.products.com/trousers/trouser/</url>
<image_url>http://www.images.co.uk/images/big/4d624426.jpg</image_url>
<verified_image>True</verified_image>
<currency>GBP</currency>
<price>1000</price>
<prev_price>1000</prev_price>
<firstseen>2010-10-27T00:00:00Z</firstseen>
<lastseen>2010-10-27T00:00:00Z</lastseen>
<merchant id="20748">Yours Clothing</merchant>
<by>Yours Clothing</by>
<description></description>
<category>
<item id="9">Lounge & nightwear</item>
<item id="3">Women</item>
<item id="2">Clothing</item>
<item id="1">Clothing, shoes & accessories</item>
</category>
</product>
</products>
</feed>
As you can see, it attempts to dump into two tables: ProductData and ProductDataCategory. Only the stuff stored in the <item>
elements should go in the latter table (in the field category).
The error message reads:
Error: Relationship expected on 'category'
I don't know why :(
Thanks for any assistance in getting this working!
Upvotes: 0
Views: 3258
Reputation: 7025
Django,
Why not try something like DBVis - http://www.dbvis.com/ - to create a visual representation of all the relationships in your database and work towards having the xsd match the generated diagram. This'll ensure you get all of these relationships.
See here for an example screeshot for a very simple database - http://www.dbvis.com/products/dbvis/doc/main/doc/ug/databaseExplorer/images/genericschemaview.png
I can vouch for it working well for much larger databases too.
Hopefully this'll help.
Upvotes: 1
Reputation: 2793
You may need to define a SQL relationship in the XSD file if you are trying to do a bulk import. I ran into a similar problem (this is just an example, not specific to your XSD):
<xs:annotation>
<xs:appinfo>
<sql:relationship name="Detail"
parent="Product"
parent-key="ProductID"
child="Details"
child-key="ProductID"
/>
<sql:relationship name="ProductFiles"
parent="Product"
parent-key="ProductID"
child="Files"
child-key="ProductID"
/>
<sql:relationship name="ProductToList"
parent="Product"
parent-key="ProductID"
child="ProductList"
child-key="ProductID"
/>
<sql:relationship name="ListToProduct"
parent="ProductList"
parent-key="ID"
child="ProductListProduct"
child-key="ProductListID"
/>
</xs:appinfo>
</xs:annotation>
Upvotes: 1