Как импортировать файлы XML с помощью пакета служб SSIS? - PullRequest
1 голос
/ 21 ноября 2011

Я пытаюсь импортировать файл XML на сервер SQL с помощью служб SSIS.XML-файл имеет такую ​​структуру

<?xml version="1.0" encoding="utf-8"?>
<dataset  xmlns="http://developer.cognos.com/schemas/xmldata/1/"  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
<!--
<dataset
    xmlns="http://developer.cognos.com/schemas/xmldata/1/"
    xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
    xs:schemaLocation="http://developer.cognos.com/schemas/xmldata/1/ xmldata.xsd"
>
-->
    <metadata>
          <item name="ORDERNUM" type="xs:string" length="26"/>
          <item name="Business Stream" type="xs:string" length="482"/>
          <item name="ORDERNO" type="xs:decimal" precision="8"/>
          <item name="ORDERTYPE" type="xs:string"/>
          <item name="ITEM_NO" type="xs:decimal" precision="8"/>
          <item name="ITEM_NO2" type="xs:string" length="52"/>
          <item name="PG" type="xs:int" precision="1"/>
          <item name="SG" type="xs:int" precision="1"/>
          <item name="LINEDESC" type="xs:string" length="122"/>
          <item name="CUSTNO" type="xs:decimal" precision="8"/>
          <item name="ORDERQNTY" type="xs:decimal" scale="3" precision="77"/>
          <item name="COST_VALUE" type="xs:decimal" scale="5" precision="77"/>
          <item name="EXTD_LIST" type="xs:decimal" scale="4" precision="77"/>
          <item name="EXTD_VALUE" type="xs:decimal" scale="4" precision="77"/>
          <item name="LINE_NO" type="xs:decimal" precision="9"/>
          <item name="TDATE" type="xs:date"/>
          <item name="TQUARTER" type="xs:decimal" precision="1"/>
          <item name="INVOICEDAT" type="xs:date"/>
          <item name="IQUARTER" type="xs:decimal" precision="1"/>
          <item name="ORIGNUM" type="xs:decimal" precision="10"/>
          <item name="ORIGTYPE" type="xs:string" length="22"/>
          <item name="TYPECALC" type="xs:string"/>
          <item name="SEQ" type="xs:int" precision="1"/>
          <item name="INC_IN_COU" type="xs:string"/>
          <item name="COSTMOD" type="xs:string" length="4"/>
          <item name="GROSSMOD" type="xs:string" length="4"/>
          <item name="CHFLOOR" type="xs:string" length="16"/>
          <item name="Group Customer Description" type="xs:string" length="482"/>
          <item name="Sales Area Description" type="xs:string" length="482"/>
          <item name="Sales Area" type="xs:string" length="8"/>
          <item name="Segment / Region Description" type="xs:string" length="482"/>
          <item name="Segment / Region" type="xs:string" length="8"/>
          <item name="ScheduledDespatchDate" type="xs:date"/>
          <item name="Status Sid" type="xs:int" precision="1"/>
          <item name="ShiptoCustomerNumber" type="xs:decimal" precision="8"/>
          <item name="CONT_TYPE" type="xs:string" length="122"/>
          <item name="EST_START" type="xs:date"/>
          <item name="EST_COMPLTN" type="xs:date"/>
          <item name="ACT_START" type="xs:date"/>
          <item name="ACT_COMPLTN" type="xs:date"/>
          <item name="Project_Status" type="xs:string" length="18"/>
    </metadata>
    <data>
        <row>
            <value>SO1897977</value>
            <value>Products &amp; Applications</value>
            <value>1897977</value>
            <value>SO</value>
            <value>731305</value>
            <value>0670800</value>
            <value>67</value>
            <value>3</value>
            <value>3/4&quot; HM10/8 CI Steam TrapBSP</value>
            <value>20021</value>
            <value>1</value>
            <value>62.136</value>
            <value>187.1</value>
            <value>187.1</value>
            <value>1000</value>
            <value>2011-11-17</value>
            <value>4</value>
            <value>2011-11-17</value>
            <value>4</value>
            <value xs:nil="true" />
            <value> </value>
            <value>SO</value>
            <value>1</value>
            <value>Y</value>
            <value>N</value>
            <value>N</value>
            <value>PDQ/KSP</value>
            <value>Other Customers</value>
            <value>Crumb Jonathan</value>
            <value>917</value>
            <value>Southern Division</value>
            <value>STH</value>
            <value>2011-11-17</value>
            <value>70</value>
            <value>60206</value>
            <value xs:nil="true" />
            <value>1900-01-01</value>
            <value>1900-01-01</value>
            <value>1900-01-01</value>
            <value>1900-01-01</value>
            <value xs:nil="true" />
        </row>
        <row>
            <value>SO1897977</value>
            <value>Products &amp; Applications</value>
            <value>1897977</value>
            <value>SO</value>
            <value>799262</value>
            <value>1643100</value>
            <value>164</value>
            <value>60</value>
            <value>1/2&quot; FIG12 Bronze Y Type BSP+ 0.8 SS</value>
            <value>20021</value>
            <value>5</value>
            <value>54.051</value>
            <value>130.2</value>
            <value>130.2</value>
            <value>2000</value>
            <value>2011-11-17</value>
            <value>4</value>
            <value>2011-11-17</value>
            <value>4</value>
            <value xs:nil="true" />
            <value> </value>
            <value>SO</value>
            <value>1</value>
            <value>Y</value>
            <value>N</value>
            <value>N</value>
            <value>PDQ/KSP</value>
            <value>Other Customers</value>
            <value>Crumb Jonathan</value>
            <value>917</value>
            <value>Southern Division</value>
            <value>STH</value>
            <value>2011-11-17</value>
            <value>70</value>
            <value>60206</value>
            <value xs:nil="true" />
            <value>1900-01-01</value>
            <value>1900-01-01</value>
            <value>1900-01-01</value>
            <value>1900-01-01</value>
            <value xs:nil="true" />
        </row>

Я создал XSD-файл, который выглядит следующим образом

<?xml version="1.0"?>
<schema xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://developer.cognos.com/schemas/xmldata/1/" xmlns="http://www.w3.org/2001/XMLSchema">
  <element name="dataset">
    <complexType>
      <sequence>
        <element minOccurs="0" name="data">
          <complexType>
            <sequence>
              <element minOccurs="0" maxOccurs="1" name="row">
                <complexType>
                  <sequence>
                      <element name="ORDERNUM" type="string" />
                      <element name="BusinessStream" type="string" />
                      <element name="ORDERNO" type="decimal"/>
                      <element name="ORDERTYPE" type="string"/>
                      <element name="ITEM_NO" type="decimal" />
                      <element name="ITEM_NO2" type="string" />
                      <element name="PG" type="int" />
                      <element name="SG" type="int" />
                      <element name="LINEDESC" type="string" />
                      <element name="CUSTNO" type="decimal" />
                      <element name="ORDERQNTY" type="decimal" />
                      <element name="COST_VALUE" type="decimal" />
                      <element name="EXTD_LIST" type="decimal" />
                      <element name="EXTD_VALUE" type="decimal"/>
                      <element name="LINE_NO" type="decimal" />
                      <element name="TDATE" type="date"/>
                      <element name="TQUARTER" type="decimal" />
                      <element name="INVOICEDAT" type="date"/>
                      <element name="IQUARTER" type="decimal" />
                      <element name="ORIGNUM" type="decimal" />
                      <element name="ORIGTYPE" type="string" />
                      <element name="TYPECALC" type="string"/>
                      <element name="SEQ" type="int" />
                      <element name="INC_IN_COU" type="string"/>
                      <element name="COSTMOD" type="string" />
                      <element name="GROSSMOD" type="string" />
                      <element name="CHFLOOR" type="string" />
                      <element name="GroupCustomerDescription" type="string" />
                      <element name="SalesAreaDescription" type="string" />
                      <element name="SalesArea" type="string" />
                      <element name="SegmentRegionDescription" type="string" />
                      <element name="SegmentRegion" type="string" />
                      <element name="ScheduledDespatchDate" type="date"/>
                      <element name="StatusSid" type="int" />
                      <element name="ShiptoCustomerNumber" type="decimal" />
                      <element name="CONT_TYPE" type="string" />
                      <element name="EST_START" type="date"/>
                      <element name="EST_COMPLTN" type="date"/>
                      <element name="ACT_START" type="date"/>
                      <element name="ACT_COMPLTN" type="date"/>
                      <element name="Project_Status" type="string" />
                  </sequence>
                </complexType>
              </element>
            </sequence>
          </complexType>
        </element>
      </sequence>
    </complexType>
  </element>
</schema>

Проблема в том, что при запуске задачи я получаю правильное количество строкно все значения равны нулю.Я совершенно новичок в XML, поэтому я подозреваю, что это что-то действительно глупое, кто-нибудь может помочь?

Ответы [ 2 ]

4 голосов
/ 21 ноября 2011

Возможно, это не решение вашей проблемы.Я использовал метод проб и ошибок, чтобы найти only причину проблемы.Одно из возможных решений, по-видимому, заключается в том, что вам необходимо восстановить XML-файл с именами элементов, как определено в XSD-файле.

Я взял ваш XML-файл и XSD-файл, чтобы создать новый пакет служб SSIS.Я использовал XML Source в Data Flow Task для чтения файлов.

Когда я выполнил пакет, я получил следующие результаты.Все значения были NULL, как вы описали в своем вопросе.

NULL values

Посмотрев файл XSD, я почувствовал, что имена, которые вы определили в элементах файлов XSD, например:ORDERNUM и BusinessStream должны иметь соответствующие узлы в файле XML, но они отсутствовали.Итак, я изменил первый элемент с узлами value на ORDERNUM и BusinessStream.

Changed Nodes

Повторно выполнил пакет, и на этот раз были показаны значенияправильно.Обратите внимание, что я изменил значения только в первом ряду и оставил второй ряд без изменений.Вот почему значения по-прежнему равны NULL.

Correct values

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

1 голос
/ 20 июля 2012

Во второй из двух статей ниже показано, как использовать файл XLST в SSIS для преобразования исходного файла XML в то, что вы можете использовать для своей описанной цели. Я предоставляю два Содержимое файла XSLT внизу.

http://sqlserverpedia.com/blog/sql-server-bloggers/loading-xml-using-ssis/

http://blog.hoegaerden.be/2011/04/20/loading-complex-xml-using-ssis/

Ремонт к указанному образцу данных:

1) Удалите пробел в начале комментария: «... xmldata / 1 / xmldata.xsd ...» в «xmldata / 1 / xmldata.xsd»

2) Добавьте </data></dataset> в самый конец данных.

Вы можете проверить это здесь (Хммммм, похоже, он там не работает!):

http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog

Или добавьте это как вторую строку XML для тестирования в IE, открыв файл XML:

<?xml-stylesheet type="text/xsl" href="Cognos.xsl"?>

Внимательно просмотрите списки xslt и обратите внимание на различия в элементе 'output'. Обратите внимание, что мне нужно было определить в моем файле XSLT пространство имен, которое использовалось в элементе набора данных XML-файла, и дать ему имя, которое я могу использовать для префикса ссылок на узлы, определенные в наборе данных. Предположим, что чувствительность к регистру имеет значение везде, потому что это, вероятно, имеет значение. Прочитайте некоторые элементы XSLT по адресу:

http://www.w3schools.com/xsl/

Cognos.xsl для отображения содержимого в виде файла с разделителями «вертикальная черта». В конце будет пустой столбец - из-за конечного разделителя - который вы должны будете игнорировать в своем коде, который использует файл.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:cog="http://developer.cognos.com/schemas/xmldata/1/">
 <xsl:output method="text" encoding="UTF-8" indent="no" 
  omit-xml-declaration="yes"
/>

  <xsl:template match="/">
    <xsl:apply-templates select="cog:dataset/cog:metadata/cog:item">
    </xsl:apply-templates>
    <xsl:text>&#13;&#10;</xsl:text>
    <xsl:apply-templates select="cog:dataset/cog:data/cog:row">
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="cog:dataset/cog:metadata/cog:item">
      <xsl:value-of select="@name"/>
    <xsl:text>|</xsl:text>
  </xsl:template>

  <xsl:template match="cog:dataset/cog:data/cog:row">
    <xsl:text>&#13;&#10;</xsl:text>
      <xsl:apply-templates select="./cog:value">
      </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="cog:dataset/cog:data/cog:row/cog:value">
      <xsl:value-of select="."/>
    <xsl:text>|</xsl:text>
  </xsl:template>

</xsl:stylesheet>

Cognos.xsl для отображения содержимого в виде таблицы HTML:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:cog="http://developer.cognos.com/schemas/xmldata/1/">
 <xsl:output method="html" encoding="UTF-8" indent="yes" 
/>

  <xsl:template match="/">
    <html><body>
    <table border="1"><tr>
    <xsl:apply-templates select="cog:dataset/cog:metadata/cog:item">
    </xsl:apply-templates>
    </tr>
    <xsl:text>&#13;&#10;</xsl:text>
    <xsl:apply-templates select="cog:dataset/cog:data/cog:row">
    </xsl:apply-templates>
    </table>
    </body></html>
  </xsl:template>

  <xsl:template match="cog:dataset/cog:metadata/cog:item">
    <td>
    <xsl:value-of select="@name"/>
    </td>
  </xsl:template>

  <xsl:template match="cog:dataset/cog:data/cog:row">
    <tr>
    <xsl:apply-templates select="./cog:value">
    </xsl:apply-templates>
    </tr>
  </xsl:template>

  <xsl:template match="cog:dataset/cog:data/cog:row/cog:value">
    <td>
    <xsl:choose>
      <xsl:when test=". !='' and . !=' '">
        <xsl:value-of select="." />
      </xsl:when>
      <xsl:when test=". =' '">
        <xsl:text>space</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>null</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
    </td>
  </xsl:template>

</xsl:stylesheet>

И, да, мы все приветствуем этот краткий сборник требований, исправлений, ссылок и методов, которые я потратил почти на 14 часов. Может быть, я превращу это в статью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...