2011-11-21 275 views
1

我想使用SSIS將XML文件導入SQL服務器。該XML文件的結構是這樣如何使用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很陌生,所以我懷疑這真的很傻,任何人都可以幫忙嗎?

回答

4

這可能不是您的問題的答案。我用試錯法找到only問題的原因。可能的解決方案之一似乎是,您需要使用XSD文件中定義的元素名稱重建您的XML文件。

我把你的XML文件和XSD文件創建成一個新的SSIS包。我在數據流任務中使用XML Source來讀取文件。

當我執行包時,我得到了下面的結果。所有的值都是NULL,就像你在問題中所描述的那樣。

NULL values

看XSD文件後,我覺得你已經在XSD文件中的元素一樣ORDERNUMBusinessStream定義的名稱應具備的XML文件中的相應節點,但他們失蹤。所以,我將節點爲value的第一個元素更改爲ORDERNUMBusinessStream

Changed Nodes

重新執行包和此時的值被正確地顯示。請注意,我只更改了第一行中的值,並保持第二行不變。這就是爲什麼值仍然爲NULL。

Correct values

希望有所幫助。

+0

感謝您的回覆,並且您正確地改變節點的工作方式。可悲的是,這個XML文件來自外部源,所以我無法控制它,無論如何不能改變文件。 –

1

以下兩篇文章中的第二篇介紹瞭如何在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 ...'到'xmldata/1/xmldata.xsd'

2)將</data></dataset>添加到數據的最後。

你可以在這裏測試(嗯,它似乎不工作在那裏!):

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

或者添加爲XML的第二行通過打開XML文件,在IE測試:

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

過目仔細XSLT列表並注意差異「輸出'元素。請注意,我需要在我的XSLT文件中定義在XML文件的'dataset'元素中使用的名稱空間,併爲其指定一個名稱,我可以使用該名稱將引用前綴添加到'dataset'中定義的節點。假定大小寫敏感性問題無處不在,因爲它很可能。請在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小時。也許我會把它寫成一篇文章。

+0

我應該指出,Siva的答案是正確的,但也許不是全部。 –