我们在尝试使用SSIS导入XML文件时遇到问题。我们有一个更复杂的XML + XSD,但是我们能够自己重现它。
我们有一个包含多个元素的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>
截图
是的,我已经看过这个:SSIS XMLSource only seeing null values in XML variable - 但改变源XML并不是我们的选择。
答案 0 :(得分: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源从变量加载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>