0

我希望有一个人可以帮助我。我对此很陌生。我想知道是否有可能获得一个 XSD 架构来将 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>

如您所见,它尝试转储到两个表中:ProductDataProductDataCategory。只有存储在<item>元素中的东西才应该放在后一个表中(在字段类别中)。

错误消息如下:

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

我不知道为什么:(

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

4

2 回答 2

1

姜戈,

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

有关非常简单的数据库的示例截图,请参见此处 - http://www.dbvis.com/products/dbvis/doc/main/doc/ug/databaseExplorer/images/genericschemaview.png

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

希望这会有所帮助。

于 2010-12-01T13:53:08.990 回答
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>
于 2010-11-29T18:24:11.580 回答