【问题标题】:How do I import XML files using an SSIS package?如何使用 SSIS 包导入 XML 文件?
【发布时间】:2011-11-21 11:36:05
【问题描述】:

我正在尝试使用 SSIS 将 XML 文件导入 SQL Server。 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 很陌生,所以我怀疑这真的很愚蠢,有人可以帮忙吗?

【问题讨论】:

    标签: xml xsd ssis


    【解决方案1】:

    这可能不是您问题的答案。我通过反复试验找到了only 问题的原因。一种可能的解决方案似乎是您需要使用 XSD 文件中定义的元素名称重建 XML 文件。

    我用你的 XML 文件和 XSD 文件创建了一个新的 SSIS 包。我在数据流任务中使用 XML Source 来读取文件。

    当我执行包时,我得到了以下结果。正如您在问题中描述的那样,所有值都是 NULL。

    查看XSD文件后,我觉得您在XSD文件中的元素中定义的名称,如ORDERNUM和BusinessStream,在XML文件中应该有对应的节点,但它们不见了。因此,我将具有节点 value 的第一个元素更改为 ORDERNUM 和 BusinessStream。

    重新执行包,这次值显示正确。请注意,我只更改了第一行中的值,而第二行保持不变。这就是为什么这些值仍然为 NULL。

    希望对您有所帮助。

    【讨论】:

    • 感谢您的回复,您说得对,更改节点会起作用。遗憾的是,这个 XML 文件来自外部源,所以我无法控制它,也无法更改文件。
    【解决方案2】:

    下面两篇文章中的第二篇展示了如何在 SSIS 中使用 XLST 文件将 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...' to 'xmldata/1/xmldata.xsd'

    2) 在数据的最后添加&lt;/data&gt;&lt;/dataset&gt;。

    你可以在这里测试它(嗯,它似乎在那里不起作用!):

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

    或者在 IE 中打开 XML 文件将其添加为 XML 的第二行:

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

    仔细查看 xslt 列表并注意“输出”元素中的差异。请注意,我需要在我的 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 小时研究这些简明的需求、修复、链接和技术集合,欢迎大家阅读。也许我会把它写成一篇文章。

    【讨论】:

    • 我应该指出 Siva 的回答是正确的,但也许不是全部。
    猜你喜欢
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多