编写XSD Schema以将XML数据放入SQL表中

时间:2010-11-18 18:02:41

标签: sql-server xml xsd sqlxml

我希望有人可以帮助我。我对此非常陌生。我想知道是否有可能让XSD Schema将XML数据转储到多个 SQL表中(使用sql:relation attribute等)。

一个表没有问题,所以我只是想知道是否可以将数据转储成两个。能够使用一个XSD Schema执行此操作会很高兴,但是我是否必须对第二个表的XML进行两次传递?

感谢您的帮助。


这是架构本身:

<?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>

以下是我们导入的XML示例:

<?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 &amp; nightwear</item>
        <item id="3">Women</item>
        <item id="2">Clothing</item>
        <item id="1">Clothing, shoes &amp; accessories</item>
      </category>
    </product>
</products>
</feed>

如您所见,它会尝试转储到两个表中: ProductData ProductDataCategory 。只有存储在<item>元素中的内容应该放在后一个表格中(在字段类别中)。

错误消息显示为:

  

错误:“类别”的预期关系

我不知道为什么:(

感谢您为此工作提供的任何帮助!

2 个答案:

答案 0 :(得分:1)

如果您尝试进行批量导入,则可能需要在XSD文件中定义SQL关系。我遇到了类似的问题(这只是一个例子,不是特定于你的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>

答案 1 :(得分:1)

Django,

为什么不尝试像DBVis这样的东西 - http://www.dbvis.com/ - 来创建数据库中所有关系的可视化表示,并努力使xsd与生成的图匹配。这将确保您获得所有这些关系。

在这里查看一个非常简单的数据库的示例screeshot - http://www.dbvis.com/products/dbvis/doc/main/doc/ug/databaseExplorer/images/genericschemaview.png

我也可以保证它适用于更大的数据库。

希望这会有所帮助。