2014-09-04 44 views
1

尝试使用SSIS导入XML文件时遇到问题。我们有一个更复杂的XML + XSD来解决这个问题,但是我们可以自己重现它。SSIS XML数据源 - 无界元素为NULL

我们有一个包含多个元素的XML文件。我们从它生成了XSD。使用数据可视化工具,我们看到找到了4行,但值为NULL。

我们忽略了什么,或者我们该如何解决?

XML

<root> 
    <index>a</index> 
    <index>b</index> 
    <index>n</index> 
    <index>x</index> 
</root> 

XSD

<?xml version="1.0" encoding="Windows-1252"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" name="index" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

截图

enter image description here

是的,我见过这个:SSIS XMLSource only seeing null values in XML variable - 但更改源XML对我们来说不是一个真正的选择。

回答

1

我们没有解决这个问题,我们创建了一个解决方法。由于我们无法改变源数据的外观,因此我们必须自行改变它。因此,我们写了一个XSLT转换,从转换XML:

<Tag> 
    <Folder>Whatever</Folder> 
    <Index>2014-03-31</Index> 
    <Index>31454534</Index> 
    <Index>3274</Index> 
    <Index>Testname1 Testname2</Index> 
</Tag> 

要:

<Tags> 
    <Tag Folder="Whatever" Index1="2014-03-31" Index2="31454534" Index3="3274" Index4="Testname1 Testname2" /> 
</Tags> 

XSLT低于(我摆脱了所有的名字之类的东西,所以这不是一个工作示例) 。我们从XML任务运行转换(如此处所述:http://blogs.msdn.com/b/mattm/archive/2007/12/15/xml-source-making-things-easier-with-xslt.aspx)。我们将结果保存到一个变量中。然后,我们使用从源变量加载XML的XML源运行数据流任务。然后出现所有行。然后,我们用这个作为我们的脚本,分量输入,我们有机会获得:Row.Folder,Row.Index1 ...等

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       xmlns:pmd="http://something" 
       xmlns:default="http://something" 
       xmlns:k="http://something" 
       exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
    <k:TagList> 
     <k:Tags> 
     <xsl:apply-templates/> 
     </k:Tags> 
    </k:TagList> 
    </xsl:template> 

    <xsl:template match="default:Metadata"> 
    <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="pmd:Tag"> 
    <k:Tag> 
     <xsl:attribute name="Folder"> 
     <xsl:value-of select="pmd:Folder" /> 
     </xsl:attribute> 
     <xsl:attribute name="Index1"> 
     <xsl:value-of select="pmd:Index[1]" /> 
     </xsl:attribute> 
     <xsl:attribute name="Index2"> 
     <xsl:value-of select="pmd:Index[2]" /> 
     </xsl:attribute> 
     <xsl:attribute name="Index3"> 
     <xsl:value-of select="pmd:Index[3]" /> 
     </xsl:attribute> 
     <xsl:attribute name="Index4"> 
     <xsl:value-of select="pmd:Index[4]" /> 
     </xsl:attribute> 
    </k:Tag> 
    </xsl:template>