<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblogcasts.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Simons SQL Blog : SSIS - Integration Services, SQL Server 2005, c#</title><link>http://sqlblogcasts.com/blogs/simons/archive/tags/SSIS+-+Integration+Services/SQL+Server+2005/c_2300_/default.aspx</link><description>Tags: SSIS - Integration Services, SQL Server 2005, c#</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>SSIS - XML Source Script</title><link>http://sqlblogcasts.com/blogs/simons/archive/2010/03/11/SSIS---XML-Source-Script.aspx</link><pubDate>Thu, 11 Mar 2010 20:20:55 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:13258</guid><dc:creator>simonsabin</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/simons/rsscomments.aspx?PostID=13258</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/simons/commentapi.aspx?PostID=13258</wfw:comment><comments>http://sqlblogcasts.com/blogs/simons/archive/2010/03/11/SSIS---XML-Source-Script.aspx#comments</comments><description>
&lt;p&gt;The XML Source in SSIS is great if you have a 1 to 1 
mapping between entity and table. You can do more complex mapping but it becomes 
very messy and won&amp;#39;t perform. What other options do you have?&lt;/p&gt;
&lt;p&gt;The challenge with XML processing is to not need a huge amount of memory. I 
remember using the early versions of Biztalk with loaded the whole document into 
memory to map from one document type to another. This was fine for small 
documents but was an absolute killer for large documents.&lt;/p&gt;
&lt;p&gt;You therefore need a streaming approach.&lt;/p&gt;
&lt;p&gt;For flexibility however you want to be able to generate your rows easily, and 
if you&amp;#39;ve ever used the XmlReader you will know its ugly code to write.&lt;/p&gt;
&lt;p&gt;That brings me on to LINQ. The is an implementation of LINQ over XML which is 
really nice. You can write nice LINQ queries instead of the XMLReader stuff. The 
downside is that by default LINQ to XML requires a whole XML document to work 
with. No streaming.&lt;/p&gt;
&lt;p&gt;Your code would look like this. We create an XDocument and then enumerate 
over a set of&amp;nbsp;annoymous types we generate&amp;nbsp;from our LINQ statement&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:#2b91af;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;XDocument&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; x = 
&lt;span style="COLOR:#2b91af;"&gt;XDocument&lt;/span&gt;.Load(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;C:\\TEMP\\CustomerOrders-Attribute.xml&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;foreach&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; (&lt;span style="COLOR:blue;"&gt;var&lt;/span&gt; xdata &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; (&lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; customer &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; 
x.Elements(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;OrderInterface&amp;quot;&lt;/span&gt;).Elements(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Customer&amp;quot;&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; order &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; customer.Elements(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Orders&amp;quot;&lt;/span&gt;).Elements(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Order&amp;quot;&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;select&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; { Account =    customer.Attribute(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;AccountNumber&amp;quot;&lt;/span&gt;).Value&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;, 
OrderDate = order.Attribute(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;OrderDate&amp;quot;&lt;/span&gt;).Value }&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;))&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;Output0Buffer.AddRow();&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Output0Buffer.AccountNumber = 
 xdata.Account;&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Output0Buffer.OrderDate = 
&lt;span style="COLOR:#2b91af;"&gt;Convert&lt;/span&gt;.ToDateTime(xdata.OrderDate);&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;As I said the downside to this is that you are loading the whole document 
into memory.&lt;/p&gt;
&lt;p&gt;I did some googling and came across some helpful videos from a nice UK DPE 
Mike Taulty &lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/289/LINQ-to-XML-Streaming-In-Large-Documents.aspx"&gt;http://www.microsoft.com/uk/msdn/screencasts/screencast/289/LINQ-to-XML-Streaming-In-Large-Documents.aspx&lt;/a&gt;. 
Which show you how you can combine LINQ and the XmlReader to get a semi 
streaming approach. I took what he did and implemented it in SSIS. What I found 
odd was that when I ran it&amp;nbsp;I got different numbers between using the 
streamed and non streamed versions. I found the cause was a little bug in Mikes 
code that causes the pointer in the XmlReader to progress past the start of the 
element and thus&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;foreach&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; (&lt;span style="COLOR:blue;"&gt;var&lt;/span&gt; xdata &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; (&lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; customer &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; 
StreamReader(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;C:\\TEMP\\CustomerOrders-Attribute.xml&amp;quot;&lt;/span&gt;,&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Customer&amp;quot;&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; order &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; customer.Elements(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Orders&amp;quot;&lt;/span&gt;).Elements(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Order&amp;quot;&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;select&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; { Account =    customer.Attribute(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;AccountNumber&amp;quot;&lt;/span&gt;).Value&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
, OrderDate = order.Attribute(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;OrderDate&amp;quot;&lt;/span&gt;).Value }&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;))&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;Output0Buffer.AddRow();&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;Output0Buffer.AccountNumber = xdata.Account;&lt;/span&gt;&lt;/p&gt;
&lt;p style="LINE-HEIGHT:normal;MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;Output0Buffer.OrderDate = &lt;span style="COLOR:#2b91af;"&gt;Convert&lt;/span&gt;.ToDateTime(xdata.OrderDate);&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 10pt;" class="MsoNormal"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;These look very similiar and they are the key element is 
the method we are calling, StreamReader. This method is what gives us streaming, 
what it does is return a IEnumerable list of elements, because of the way that LINQ works this 
results in the data being streamed in, it returns the elements one at 
a tiem rather than building a collection of them. The key is the use 
of the IEnumerable and the &amp;quot;yield return&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;static&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;XElement&lt;/span&gt;&amp;gt; StreamReader(&lt;span style="COLOR:#2b91af;"&gt;String&lt;/span&gt; filename, &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; elementName)&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;using&lt;/span&gt; (&lt;span style="COLOR:#2b91af;"&gt;XmlReader&lt;/span&gt; 
xr = &lt;span style="COLOR:#2b91af;"&gt;XmlReader&lt;/span&gt;.Create(filename))&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;xr.MoveToContent();&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;while&lt;/span&gt; (xr.Read()) //Reads the first 
element&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;while&lt;/span&gt; (xr.NodeType == &lt;span style="COLOR:#2b91af;"&gt;XmlNodeType&lt;/span&gt;.Element &amp;amp;&amp;amp; xr.Name == 
elementName)&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;XElement&lt;/span&gt; node =   (&lt;span style="COLOR:#2b91af;"&gt;XElement&lt;/span&gt;)&lt;span style="COLOR:#2b91af;"&gt;XElement&lt;/span&gt;.ReadFrom(xr);&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;yield&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; node;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/span&gt;xr.Close();&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN:0cm 0cm 0pt;" class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;This code is specifically designed to return a list of the elements with a 
specific name. The first Read reads the root element and then the inner while 
loop checks to see if the current element is the type we want. If not we do the 
xr.Read() again until we find the element type we want. We then use the neat 
function XElement.ReadFrom to read an element and all its sub elements into an 
XElement. This is what is returned and can be consumed by the LINQ statement. 
Essentially once one element has been read we need to check if we are still on 
the same element type and name (the inner loop) This was Mikes mistake, if we 
called .Read again we would advance the XmlReader beyond the start of the 
Element and so the ReadFrom method wouldn&amp;#39;t work.&lt;/p&gt;
&lt;p&gt;               
              
  To get this working,&lt;/p&gt;
&lt;p&gt;1. Put a script component in your data flow as a source component. &lt;/p&gt;
&lt;p&gt;2. Then add the columns you wish to the output. &lt;/p&gt;
&lt;p&gt;3. Add the&amp;nbsp;&lt;font size="2" face="Courier New"&gt;StreamReader&lt;/font&gt; function 
to your script code&lt;/p&gt;
&lt;p&gt;4. Put the first foreach in the CreateNewOutputRows method &lt;/p&gt;
&lt;p&gt;4. Change the LINQ query etc to match what you want&lt;/p&gt;
&lt;p&gt;With the code above you can use what ever LINQ statement you like to flatten 
your XML into the rowsets you want. You could even have multiple outputs and 
generate your own surrogate keys.&lt;/p&gt;&lt;hr /&gt;
&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt; 
&lt;/script&gt;
&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=13258" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/simons/archive/tags/SQL+Server+2005/default.aspx">SQL Server 2005</category><category domain="http://sqlblogcasts.com/blogs/simons/archive/tags/Tips+and+Tricks/default.aspx">Tips and Tricks</category><category domain="http://sqlblogcasts.com/blogs/simons/archive/tags/SSIS+-+Integration+Services/default.aspx">SSIS - Integration Services</category><category domain="http://sqlblogcasts.com/blogs/simons/archive/tags/XML/default.aspx">XML</category><category domain="http://sqlblogcasts.com/blogs/simons/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://sqlblogcasts.com/blogs/simons/archive/tags/c_2300_/default.aspx">c#</category></item></channel></rss>