Написание схемы XSD для помещения данных XML в таблицы SQL - PullRequest
0 голосов
/ 18 ноября 2010

Я надеюсь, что кто-то может мне помочь. Я очень новичок в этом. Мне было интересно, возможно ли получить схему XSD для вывода данных XML в несколько таблиц SQL (используя sql:relation attribute и т. Д.).

Одна таблица не вызывает проблем, поэтому я просто подумал, возможно ли сваливать данные пополам. Было бы неплохо сделать это с одной схемой XSD, но нужно ли мне сделать два прохода в 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 ]

1 голос
/ 01 декабря 2010

Джанго,

Почему бы не попробовать что-то вроде DBVis - http://www.dbvis.com/ - чтобы создать визуальное представление всех отношений в вашей базе данных и работать над тем, чтобы xsd соответствовал сгенерированной диаграмме. Это гарантирует, что вы получите все эти отношения.

Смотрите здесь пример скриншота для очень простой базы данных - http://www.dbvis.com/products/dbvis/doc/main/doc/ug/databaseExplorer/images/genericschemaview.png

Я могу поручиться за то, что он хорошо работает и для гораздо больших баз данных.

Надеюсь, это поможет.

1 голос
/ 29 ноября 2010

Вам может потребоваться определить отношение SQL в файле XSD, если вы пытаетесь выполнить массовый импорт.Я столкнулся с подобной проблемой (это только пример, не относится к вашему 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>
...