2014-09-04 1 views
1

У нас возникла проблема при попытке импортировать XML-файл с использованием SSIS. У нас есть более сложный XML + XSD, для которого эта проблема возникает, но мы смогли воспроизвести ее самостоятельно.SSIS XML datasource - неограниченные элементы: 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> 

To:

<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 из переменной. Затем появятся все строки DO. Затем мы используем это в качестве входных данных для нашего сценария-компонента, где мы имеем доступ к: 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> 
Смежные вопросы