<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>CharlieDigital</title>
    <link>http://www.charliedigital.com/</link>
    <description>This site is a combo blog/portfolio for me, Charles Chen.</description>
    <language>en-us</language>
    <copyright>Charles Chen</copyright>
    <lastBuildDate>Tue, 06 May 2008 23:15:31 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.8.5223.0</generator>
    <managingEditor>cchen@charliedigital.com</managingEditor>
    <webMaster>cchen@charliedigital.com</webMaster>
    <item>
      <trackback:ping>http://www.charliedigital.com/Trackback.aspx?guid=7b8e8890-e408-4939-80c3-664390783333</trackback:ping>
      <pingback:server>http://www.charliedigital.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.charliedigital.com/PermaLink,guid,7b8e8890-e408-4939-80c3-664390783333.aspx</pingback:target>
      <dc:creator>cchen@charliedigital.com (Charles Chen)</dc:creator>
      <wfw:comment>http://www.charliedigital.com/CommentView,guid,7b8e8890-e408-4939-80c3-664390783333.aspx</wfw:comment>
      <wfw:commentRss>http://www.charliedigital.com/SyndicationService.asmx/GetEntryCommentsRss?guid=7b8e8890-e408-4939-80c3-664390783333</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      This is quite exciting: my wife is now a published author (with her own ISBN and everything
      :-D)!
   </p>
        <p>
      Check out her book <em><a href="http://www.crystalspringsbooks.com/index.html?stocknumber=08011">The
      Parent Connection for Singapore Math</a></em>.
   </p>
        <p style="TEXT-ALIGN: center">
          <img class="matte" src="http://www.charliedigital.com/content/binary/the-book.jpg" border="0" />
        </p>
        <p>
      :-D She's also got a <a href="http://www.crystalspringsbooks.com/index.html?stocknumber=08003">media
      set</a>, you know, if you've got $459 and nothing better to spend it on :-P
   </p>
        <img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=7b8e8890-e408-4939-80c3-664390783333" />
      </body>
      <title>Buy This Book!</title>
      <guid>http://www.charliedigital.com/PermaLink,guid,7b8e8890-e408-4939-80c3-664390783333.aspx</guid>
      <link>http://www.charliedigital.com/PermaLink,guid,7b8e8890-e408-4939-80c3-664390783333.aspx</link>
      <pubDate>Tue, 06 May 2008 23:15:31 GMT</pubDate>
      <description>&lt;p&gt;
   This is quite exciting: my wife is now a published author (with her own ISBN and everything
   :-D)!
&lt;/p&gt;
&lt;p&gt;
   Check out her book &lt;em&gt;&lt;a href="http://www.crystalspringsbooks.com/index.html?stocknumber=08011"&gt;The
   Parent Connection for Singapore Math&lt;/a&gt;&lt;/em&gt;.
&lt;/p&gt;
&lt;p style="TEXT-ALIGN: center"&gt;
   &lt;img class=matte src="http://www.charliedigital.com/content/binary/the-book.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   :-D She's also got a &lt;a href="http://www.crystalspringsbooks.com/index.html?stocknumber=08003"&gt;media
   set&lt;/a&gt;, you know, if you've got $459 and nothing better to spend it on :-P
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=7b8e8890-e408-4939-80c3-664390783333" /&gt;</description>
      <comments>http://www.charliedigital.com/CommentView,guid,7b8e8890-e408-4939-80c3-664390783333.aspx</comments>
      <category>Life</category>
    </item>
    <item>
      <trackback:ping>http://www.charliedigital.com/Trackback.aspx?guid=8e4476a8-7717-4f67-be95-9ec088ae9112</trackback:ping>
      <pingback:server>http://www.charliedigital.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.charliedigital.com/PermaLink,guid,8e4476a8-7717-4f67-be95-9ec088ae9112.aspx</pingback:target>
      <dc:creator>cchen@charliedigital.com (Charles Chen)</dc:creator>
      <wfw:comment>http://www.charliedigital.com/CommentView,guid,8e4476a8-7717-4f67-be95-9ec088ae9112.aspx</wfw:comment>
      <wfw:commentRss>http://www.charliedigital.com/SyndicationService.asmx/GetEntryCommentsRss?guid=8e4476a8-7717-4f67-be95-9ec088ae9112</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      Anyone who's done any bit of SharePoint development is probably familiar with the
      completely useless "Unknown Error" view.  Well, in fact, SharePoint actually
      knows what the error is, it just doesn't want to tell you (okay, it's really just
      disabled for users).
   </p>
        <p>
      In ASP.NET, you can usually get error messages to show up by setting <span class="code">&lt;customErrors="Off"/&gt;</span></p>
        <p>
      However, this is not sufficient with SharePoint. As <a href="http://www.keirgordon.com/2007/02/sharepoint-error-detail.html">Stefan
      Keir Gordan</a> points out, to get the nitty gritty details, you also need to set <span class="code">&lt;SafeMode
      CallStack="True""/&gt;</span></p>
        <img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=8e4476a8-7717-4f67-be95-9ec088ae9112" />
      </body>
      <title>SharePoint "Unknown Error" Quirk</title>
      <guid>http://www.charliedigital.com/PermaLink,guid,8e4476a8-7717-4f67-be95-9ec088ae9112.aspx</guid>
      <link>http://www.charliedigital.com/PermaLink,guid,8e4476a8-7717-4f67-be95-9ec088ae9112.aspx</link>
      <pubDate>Tue, 06 May 2008 19:16:53 GMT</pubDate>
      <description>&lt;p&gt;
   Anyone who's done any bit of SharePoint development is probably familiar with the
   completely useless "Unknown Error" view.&amp;nbsp; Well, in fact, SharePoint actually
   knows what the error is, it just doesn't want to tell you (okay, it's really just
   disabled for users).
&lt;/p&gt;
&lt;p&gt;
   In ASP.NET, you can usually get error messages to show up by setting &lt;span class=code&gt;&amp;lt;customErrors="Off"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   However, this is not sufficient with SharePoint. As &lt;a href="http://www.keirgordon.com/2007/02/sharepoint-error-detail.html"&gt;Stefan
   Keir Gordan&lt;/a&gt; points out, to get the nitty gritty details, you also need to set &lt;span class=code&gt;&amp;lt;SafeMode
   CallStack="True""/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=8e4476a8-7717-4f67-be95-9ec088ae9112" /&gt;</description>
      <comments>http://www.charliedigital.com/CommentView,guid,8e4476a8-7717-4f67-be95-9ec088ae9112.aspx</comments>
      <category>SharePoint</category>
    </item>
    <item>
      <trackback:ping>http://www.charliedigital.com/Trackback.aspx?guid=f1353968-e3b9-4d81-812f-6d264e56239b</trackback:ping>
      <pingback:server>http://www.charliedigital.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.charliedigital.com/PermaLink,guid,f1353968-e3b9-4d81-812f-6d264e56239b.aspx</pingback:target>
      <dc:creator>cchen@charliedigital.com (Charles Chen)</dc:creator>
      <wfw:comment>http://www.charliedigital.com/CommentView,guid,f1353968-e3b9-4d81-812f-6d264e56239b.aspx</wfw:comment>
      <wfw:commentRss>http://www.charliedigital.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f1353968-e3b9-4d81-812f-6d264e56239b</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I came across an interesting issue while trying to run some MbUnit <span class="code">RowTest</span>s
      this morning.
   </p>
        <p>
      Namely, it seemed that the rows being passed in contained all null values.  It
      left me scratching my head.  I ran the tests using MbUnit console and it worked
      fine but didn't work as expected from TestDriven.NET in VS2005.
   </p>
        <p>
      Well, it turns out that (I think) the install for MbUnit does <em>not</em> create
      the requisite registry keys in an x64 environment.  It properly creates the keys
      under the <span class="code">Wow6432Node</span>, but it does not create the keys under
      the path:
   </p>
        <div class="code">HKEY_LOCAL_MACHINE\SOFTWARE\MutantDesign\TestDriven.NET\TestRunners
   </div>
        <p>
      So to make it work, all you have to do is to copy the string values from the <span class="code">Wow6432Node</span> to
      the key above and restart VS.
   </p>
        <p>
      Hope this saves some headaches for other developers working in an x64 environment!
   </p>
        <p>
          <em>
            <strong>Update: </strong>Jeff Brown notes in the comments that this should be
      fixed with future releases so that x64 environment registry keys are properly generated.</em>
        </p>
        <img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=f1353968-e3b9-4d81-812f-6d264e56239b" />
      </body>
      <title>MbUnit And TestDriven.NET On x64</title>
      <guid>http://www.charliedigital.com/PermaLink,guid,f1353968-e3b9-4d81-812f-6d264e56239b.aspx</guid>
      <link>http://www.charliedigital.com/PermaLink,guid,f1353968-e3b9-4d81-812f-6d264e56239b.aspx</link>
      <pubDate>Mon, 05 May 2008 16:23:45 GMT</pubDate>
      <description>&lt;p&gt;
   I came across an interesting issue while trying to run some MbUnit &lt;span class=code&gt;RowTest&lt;/span&gt;s
   this morning.
&lt;/p&gt;
&lt;p&gt;
   Namely, it seemed that the rows being passed in contained all null values.&amp;nbsp; It
   left me scratching my head.&amp;nbsp; I ran the tests using MbUnit console and it worked
   fine but didn't work as expected from TestDriven.NET in VS2005.
&lt;/p&gt;
&lt;p&gt;
   Well, it turns out that (I think) the install for MbUnit does &lt;em&gt;not&lt;/em&gt; create
   the requisite registry keys in an x64 environment.&amp;nbsp; It properly creates the keys
   under the &lt;span class=code&gt;Wow6432Node&lt;/span&gt;, but it does not create the keys under
   the path:
&lt;/p&gt;
&lt;div class=code&gt;HKEY_LOCAL_MACHINE\SOFTWARE\MutantDesign\TestDriven.NET\TestRunners
&lt;/div&gt;
&lt;p&gt;
   So to make it work, all you have to do is to copy the string values from the &lt;span class=code&gt;Wow6432Node&lt;/span&gt; to
   the key above and restart VS.
&lt;/p&gt;
&lt;p&gt;
   Hope this saves some headaches for other developers working in an x64 environment!
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;&lt;strong&gt;Update: &lt;/strong&gt;Jeff Brown notes in the comments that this should be
   fixed with future releases so that x64 environment registry keys are properly generated.&lt;/em&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=f1353968-e3b9-4d81-812f-6d264e56239b" /&gt;</description>
      <comments>http://www.charliedigital.com/CommentView,guid,f1353968-e3b9-4d81-812f-6d264e56239b.aspx</comments>
      <category>Dev</category>
    </item>
    <item>
      <trackback:ping>http://www.charliedigital.com/Trackback.aspx?guid=95588442-cf2f-4bbe-a9bd-72a56b38d49f</trackback:ping>
      <pingback:server>http://www.charliedigital.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.charliedigital.com/PermaLink,guid,95588442-cf2f-4bbe-a9bd-72a56b38d49f.aspx</pingback:target>
      <dc:creator>cchen@charliedigital.com (Charles Chen)</dc:creator>
      <wfw:comment>http://www.charliedigital.com/CommentView,guid,95588442-cf2f-4bbe-a9bd-72a56b38d49f.aspx</wfw:comment>
      <wfw:commentRss>http://www.charliedigital.com/SyndicationService.asmx/GetEntryCommentsRss?guid=95588442-cf2f-4bbe-a9bd-72a56b38d49f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.cnn.com/2008/US/04/26/atheist.soldier.ap/index.html">This story</a> is
      kind of upsetting.
   </p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
      Like hundreds of young men joining the Army in recent years, Jeremy Hall professes
      a desire to serve his country while it fights terrorism.
   </p>
          <p>
      Known as "the atheist guy," Hall has been called immoral, a devil worshipper and --
      just as severe to some soldiers -- gay, none of which, he says, is true. Hall even
      drove fellow soldiers to church in Iraq and paused while they prayed before meals.
   </p>
          <p>
       "I was ashamed to say that I was an atheist," Hall said.
   </p>
          <p>
      "Religion brings comfort to a lot of people," he said. "Personally, I don't want it
      or need it. But I'm not going to get down on anybody else for it."
   </p>
        </blockquote>
        <p dir="ltr">
      I dunno...it's just kind of unnerving that in this day and age, a person should
      feel ashamed to be known as an atheist (especially one that is respectful of others'
      right to believe).  In fact, <a href="http://www.asanet.org/cs/root/topnav/press/atheists_are_distrusted">recent
      polls</a> have shown that atheists are the most distrusted group in America, even
      below Muslims:
   </p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p dir="ltr">
      From a telephone sampling of more than 2,000 households, university researchers found
      that Americans rate atheists below Muslims, recent immigrants, gays and lesbians and
      other minority groups in “sharing their vision of American society.” <strong>Atheists
      are also the minority group most Americans are least willing to allow their children
      to marry</strong>.
   </p>
        </blockquote>
        <p>
      It just doesn't make sense.
   </p>
        <img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=95588442-cf2f-4bbe-a9bd-72a56b38d49f" />
      </body>
      <title>The Sad State of Secularism</title>
      <guid>http://www.charliedigital.com/PermaLink,guid,95588442-cf2f-4bbe-a9bd-72a56b38d49f.aspx</guid>
      <link>http://www.charliedigital.com/PermaLink,guid,95588442-cf2f-4bbe-a9bd-72a56b38d49f.aspx</link>
      <pubDate>Sat, 26 Apr 2008 20:26:01 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;a href="http://www.cnn.com/2008/US/04/26/atheist.soldier.ap/index.html"&gt;This story&lt;/a&gt; is
   kind of upsetting.
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   Like hundreds of young men joining the Army in recent years, Jeremy Hall professes
   a desire to serve his country while it fights terrorism.
&lt;/p&gt;
&lt;p&gt;
   Known as "the atheist guy," Hall has been called immoral, a devil worshipper and --
   just as severe to some soldiers -- gay, none of which, he says, is true. Hall even
   drove fellow soldiers to church in Iraq and paused while they prayed before meals.
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;"I was ashamed to say that I was an atheist," Hall said.
&lt;/p&gt;
&lt;p&gt;
   "Religion brings comfort to a lot of people," he said. "Personally, I don't want it
   or need it. But I'm not going to get down on anybody else for it."
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p dir=ltr&gt;
   I dunno...it's just kind of unnerving that in this day and age, a&amp;nbsp;person should
   feel ashamed to be known as an atheist (especially one that is respectful of others'
   right to believe).&amp;nbsp; In fact, &lt;a href="http://www.asanet.org/cs/root/topnav/press/atheists_are_distrusted"&gt;recent
   polls&lt;/a&gt; have shown that atheists are the most distrusted group in America, even
   below Muslims:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p dir=ltr&gt;
   From a telephone sampling of more than 2,000 households, university researchers found
   that Americans rate atheists below Muslims, recent immigrants, gays and lesbians and
   other minority groups in “sharing their vision of American society.” &lt;strong&gt;Atheists
   are also the minority group most Americans are least willing to allow their children
   to marry&lt;/strong&gt;.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   It just doesn't make sense.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=95588442-cf2f-4bbe-a9bd-72a56b38d49f" /&gt;</description>
      <comments>http://www.charliedigital.com/CommentView,guid,95588442-cf2f-4bbe-a9bd-72a56b38d49f.aspx</comments>
      <category>News;Rants</category>
    </item>
    <item>
      <trackback:ping>http://www.charliedigital.com/Trackback.aspx?guid=c080a1e8-25c8-427c-a206-9bb66d614c49</trackback:ping>
      <pingback:server>http://www.charliedigital.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.charliedigital.com/PermaLink,guid,c080a1e8-25c8-427c-a206-9bb66d614c49.aspx</pingback:target>
      <dc:creator>cchen@charliedigital.com (Charles Chen)</dc:creator>
      <wfw:comment>http://www.charliedigital.com/CommentView,guid,c080a1e8-25c8-427c-a206-9bb66d614c49.aspx</wfw:comment>
      <wfw:commentRss>http://www.charliedigital.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c080a1e8-25c8-427c-a206-9bb66d614c49</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      When working with SharePoint, you'll find yourself working with the GAC quite often
      during development.
   </p>
        <p>
      If you've seen the light and you're working with SharePoint on a VM, one tricky problem
      is how to update the GAC using a post-build event.  The following is a little
      script that I use:
   </p>
        <div class="code">
          <pre>::----------------------- GAC binaries code ------------------------
:: Check if the share is available on the server
IF EXIST "\\server-name\temp" GOTO COPYFILES
GOTO SHOWNOTICE

:: Copy file to the server
:COPYFILES
ECHO Found \\server-name\temp; proceeding to copy files...

SET SN=\\server-name\temp

:: Copy the binary
XCOPY "$(TargetPath)" "%SN%" /Y /I

:: Use PsExec to execute gacutil
PATH=$(SolutionDir)Tools;%windir%\Microsoft.Net\Framework\v2.0.50727;%programfiles%\Microsoft SDKs\Windows\v6.0\Bin;%path%

psexec \\server-name -u Administrator -p password -w "c:\temp" gacutil.exe /i "$(TargetFileName)" /f

GOTO END

:SHOWNOTICE
ECHO Your VM image is not sharing the directory "c:\temp"
GOTO END

:END
ECHO Completed
</pre>
        </div>
        <p>
      The batch script makes use of <a href="http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx">Sysinternal's
      PsExec</a>.  I've included the binary executable in my solution tree under
      the directory "Tools".
   </p>
        <p>
      The script only has one assumption: the VM (or remote machine, really) is sharing
      the c:\temp directory (okay, and that the path to gacutil.exe has been added to the
      remote machine's PATH environment variable).  Here's a breakdown of the logic:
   </p>
        <ol>
          <li>
         The first step is to check if the directory exists and can be reached.  If not,
         we go to the end and show a notice about sharing the directory. 
      </li>
          <li>
         If the directory is shared, the output dll from the build is copied to the shared
         directory using plain old XCOPY. 
      </li>
          <li>
         Once it's copied over, we use PsExec to execute gacutil on the VM (or remote
         machine).  The -w argument specifies the working directory on the remote machine.</li>
        </ol>
        <p>
      Enjoy!
   </p>
        <img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=c080a1e8-25c8-427c-a206-9bb66d614c49" />
      </body>
      <title>Automating Remote GAC Installs On Build</title>
      <guid>http://www.charliedigital.com/PermaLink,guid,c080a1e8-25c8-427c-a206-9bb66d614c49.aspx</guid>
      <link>http://www.charliedigital.com/PermaLink,guid,c080a1e8-25c8-427c-a206-9bb66d614c49.aspx</link>
      <pubDate>Thu, 24 Apr 2008 20:42:15 GMT</pubDate>
      <description>&lt;p&gt;
   When working with SharePoint, you'll find yourself working with the GAC quite often
   during development.
&lt;/p&gt;
&lt;p&gt;
   If you've seen the light and you're working with SharePoint on a VM, one tricky problem
   is how to update the GAC using a post-build event.&amp;nbsp; The following is a little
   script that I use:
&lt;/p&gt;
&lt;div class=code&gt;&lt;pre&gt;::----------------------- GAC binaries code ------------------------
:: Check if the share is available on the server
IF EXIST "\\server-name\temp" GOTO COPYFILES
GOTO SHOWNOTICE

:: Copy file to the server
:COPYFILES
ECHO Found \\server-name\temp; proceeding to copy files...

SET SN=\\server-name\temp

:: Copy the binary
XCOPY "$(TargetPath)" "%SN%" /Y /I

:: Use PsExec to execute gacutil
PATH=$(SolutionDir)Tools;%windir%\Microsoft.Net\Framework\v2.0.50727;%programfiles%\Microsoft SDKs\Windows\v6.0\Bin;%path%

psexec \\server-name -u Administrator -p password -w "c:\temp" gacutil.exe /i "$(TargetFileName)" /f

GOTO END

:SHOWNOTICE
ECHO Your VM image is not sharing the directory "c:\temp"
GOTO END

:END
ECHO Completed
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
   The batch script makes use of &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx"&gt;Sysinternal's
   PsExec&lt;/a&gt;.&amp;nbsp; I've included the binary executable in my&amp;nbsp;solution tree under
   the directory "Tools".
&lt;/p&gt;
&lt;p&gt;
   The script only has one assumption: the VM (or remote machine, really) is sharing
   the c:\temp directory (okay, and that the path to gacutil.exe has been added to the
   remote machine's PATH environment variable).&amp;nbsp; Here's a breakdown of the logic:
&lt;/p&gt;
&lt;ol&gt;
   &lt;li&gt;
      The first step is to check if the directory exists and can be reached.&amp;nbsp; If not,
      we go to the end and show a notice about sharing the directory. 
   &lt;li&gt;
      If the directory is shared, the output dll from the build is copied to the shared
      directory using plain old XCOPY. 
   &lt;li&gt;
      Once it's copied over, we use PsExec to execute gacutil on the VM (or&amp;nbsp;remote
      machine).&amp;nbsp; The -w argument specifies the working directory on the remote machine.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
   Enjoy!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=c080a1e8-25c8-427c-a206-9bb66d614c49" /&gt;</description>
      <comments>http://www.charliedigital.com/CommentView,guid,c080a1e8-25c8-427c-a206-9bb66d614c49.aspx</comments>
      <category>Dev</category>
    </item>
    <item>
      <trackback:ping>http://www.charliedigital.com/Trackback.aspx?guid=211c4129-4237-478c-acde-8abaabbad067</trackback:ping>
      <pingback:server>http://www.charliedigital.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.charliedigital.com/PermaLink,guid,211c4129-4237-478c-acde-8abaabbad067.aspx</pingback:target>
      <dc:creator>cchen@charliedigital.com (Charles Chen)</dc:creator>
      <wfw:comment>http://www.charliedigital.com/CommentView,guid,211c4129-4237-478c-acde-8abaabbad067.aspx</wfw:comment>
      <wfw:commentRss>http://www.charliedigital.com/SyndicationService.asmx/GetEntryCommentsRss?guid=211c4129-4237-478c-acde-8abaabbad067</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I'm constantly amazed by the number of developers who have never worked with <span class="code">FOR
      XML EXPLICIT</span> and the new <span class="code"><a href="http://msdn2.microsoft.com/en-us/library/ms345137.aspx">FOR
      XML PATH</a></span>.  If <em>I</em> were designing data access, it would be my
      go-to commands for building queries for complex data structures (nested <span class="code">DataReaders</span>? 
      yuck!).
   </p>
        <p>
      In the past, to support paging using <span class="code">FOR XML EXPLICIT</span> queries
      took tons of lines to accomplish (although there is something about the whole <em>explicitness</em> that
      makes it surprisingly legible).  Now with the fancy pants <span class="code"><a href="http://msdn2.microsoft.com/en-us/library/ms186734.aspx">ROW_NUMBER</a></span> function
      in SQL along with CTEs, a hundred line query can be written with maybe 15-20 lines.
   </p>
        <p>
      Here's a simple example that you can copy+paste and run:
   </p>
        <div class="code">
          <pre>
            <font face="Lucida Console">
              <font color="#5f5f5f">/* </font>
              <font color="#5f5f5f">Demonstrates
      usage of ROW_NUMBER and FOR XML PATH to create </font>
              <font color="#5f5f5f">pageable
      XML results queries.</font>
              <font color="#5f5f5f">In this case, the key is to page
      only on the Route objects.</font>
              <font color="#5f5f5f">*/</font>
              <font color="#5f5f5f">--//
      Mock Route table</font>
              <font color="#008000">DECLARE </font>
              <font color="#000000">@Route </font>
              <font color="#008000">TABLE </font>
              <font color="#000000">(</font>
              <font color="#000000">Id </font>
              <font color="#0000ff">int</font>
              <font color="#000000">,</font>
              <font color="#000000">Title </font>
              <font color="#0000ff">varchar</font>
              <font color="#000000">(100)</font>
              <font color="#000000">)</font>
              <font color="#5f5f5f">--//
      Mock Step table</font>
              <font color="#008000">DECLARE </font>
              <font color="#000000">@Step </font>
              <font color="#008000">TABLE </font>
              <font color="#000000">(</font>
              <font color="#000000">Id </font>
              <font color="#0000ff">int</font>
              <font color="#000000">,</font>
              <font color="#000000">RouteId </font>
              <font color="#0000ff">int</font>
              <font color="#000000">,</font>
              <font color="#000000">Title </font>
              <font color="#0000ff">varchar</font>
              <font color="#000000">(100),</font>
              <font color="#000000">Sequence </font>
              <font color="#0000ff">int</font>
              <font color="#000000">)</font>
              <font color="#5f5f5f">--//
      Insert mock data</font>
              <font color="#008000">INSERT INTO </font>
              <font color="#000000">@Route </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(1, </font>
              <font color="#ff00ff">'Route
      1'</font>
              <font color="#000000">)</font>
              <font color="#008000">INSERT INTO </font>
              <font color="#000000">@Route </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(2, </font>
              <font color="#ff00ff">'Route
      2'</font>
              <font color="#000000">)</font>
              <font color="#008000">INSERT INTO </font>
              <font color="#000000">@Route </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(3, </font>
              <font color="#ff00ff">'Route
      3'</font>
              <font color="#000000">)</font>
              <font color="#008000">INSERT INTO </font>
              <font color="#000000">@Route </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(4, </font>
              <font color="#ff00ff">'Route
      4'</font>
              <font color="#000000">)</font>
              <font color="#008000">INSERT INTO </font>
              <font color="#000000">@Route </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(5, </font>
              <font color="#ff00ff">'Route
      5'</font>
              <font color="#000000">)</font>
              <font color="#5f5f5f">--// Route 1 Steps</font>
              <font color="#008000">INSERT
      INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(1,
      1, </font>
              <font color="#ff00ff">'Step 1.1'</font>
              <font color="#000000">, 1)</font>
              <font color="#008000">INSERT
      INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(2,
      1, </font>
              <font color="#ff00ff">'Step 1.2'</font>
              <font color="#000000">, 2)</font>
              <font color="#008000">INSERT
      INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(3,
      1, </font>
              <font color="#ff00ff">'Step 1.3'</font>
              <font color="#000000">, 3)</font>
              <font color="#008000">INSERT
      INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(4,
      1, </font>
              <font color="#ff00ff">'Step 1.4'</font>
              <font color="#000000">, 4)</font>
              <font color="#008000">INSERT
      INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(5,
      1, </font>
              <font color="#ff00ff">'Step 1.5'</font>
              <font color="#000000">, 5)</font>
              <font color="#5f5f5f">--//
      Route 2 Steps</font>
              <font color="#008000">INSERT INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(6,
      2, </font>
              <font color="#ff00ff">'Step 2.1'</font>
              <font color="#000000">, 1)</font>
              <font color="#008000">INSERT
      INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(7,
      2, </font>
              <font color="#ff00ff">'Step 2.2'</font>
              <font color="#000000">, 2)</font>
              <font color="#008000">INSERT
      INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(8,
      2, </font>
              <font color="#ff00ff">'Step 2.3'</font>
              <font color="#000000">, 3)</font>
              <font color="#5f5f5f">--//
      Route 3 Steps</font>
              <font color="#008000">INSERT INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(9,
      3, </font>
              <font color="#ff00ff">'Step 3.1'</font>
              <font color="#000000">, 1)</font>
              <font color="#5f5f5f">--//
      Route 4 Steps</font>
              <font color="#008000">INSERT INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(10,
      4, </font>
              <font color="#ff00ff">'Step 4.1'</font>
              <font color="#000000">, 1)</font>
              <font color="#5f5f5f">--//
      Route 5 Steps</font>
              <font color="#008000">INSERT INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(11,
      5, </font>
              <font color="#ff00ff">'Step 5.1'</font>
              <font color="#000000">, 1)</font>
              <font color="#008000">INSERT
      INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(12,
      5, </font>
              <font color="#ff00ff">'Step 5.2'</font>
              <font color="#000000">, 2)</font>
              <font color="#008000">INSERT
      INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(13,
      5, </font>
              <font color="#ff00ff">'Step 5.3'</font>
              <font color="#000000">, 3)</font>
              <font color="#008000">INSERT
      INTO </font>
              <font color="#000000">@Step </font>
              <font color="#008000">VALUES </font>
              <font color="#000000">(14,
      5, </font>
              <font color="#ff00ff">'Step 5.4'</font>
              <font color="#000000">, 4)</font>
              <font color="#5f5f5f">/*</font>
              <font color="#5f5f5f">Define
      the page size.</font>
              <font color="#5f5f5f"> -- Add sorting and ordering later</font>
              <font color="#5f5f5f">*/</font>
              <font color="#008000">DECLARE </font>
              <font color="#000000">@PageSize </font>
              <font color="#0000ff">int</font>
              <font color="#008000">DECLARE </font>
              <font color="#000000">@CurrentPage </font>
              <font color="#0000ff">int</font>
              <font color="#008000">SET </font>
              <font color="#000000">@CurrentPage
      = 0</font>
              <font color="#008000">SET </font>
              <font color="#000000">@PageSize = 3</font>
              <font color="#5f5f5f">/*</font>
              <font color="#5f5f5f">Calculate
      starting and ending row.</font>
              <font color="#5f5f5f">*/</font>
              <font color="#008000">DECLARE </font>
              <font color="#000000">@StartIndex </font>
              <font color="#0000ff">int</font>
              <font color="#008000">DECLARE </font>
              <font color="#000000">@EndIndex </font>
              <font color="#0000ff">int</font>
              <font color="#008000">SET </font>
              <font color="#000000">@StartIndex
      = @CurrentPage * @PageSize</font>
              <font color="#008000">SET </font>
              <font color="#000000">@EndIndex
      = @StartIndex + @PageSize</font>
              <font color="#000000">; </font>
              <font color="#5f5f5f">--//
      Need to terminate with a semicolon for CTE </font>
              <font color="#5f5f5f">/*</font>
              <font color="#5f5f5f">Perform
      core XML select</font>
              <font color="#5f5f5f">*/</font>
              <font color="#008000">WITH </font>
              <font color="#000000">Routes </font>
              <font color="#008000">AS </font>
              <font color="#000000">(</font>
              <font color="#008000">SELECT </font>
              <font color="#000000">*,</font>
              <font color="#000000">ROW_NUMBER()
      OVER (</font>
              <font color="#008000">ORDER BY </font>
              <font color="#000000">Id) </font>
              <font color="#008000">AS </font>
              <font color="#ff00ff">'RowNumber'</font>
              <font color="#008000">FROM</font>
              <font color="#000000">@Route</font>
              <font color="#000000">)</font>
              <font color="#008000">SELECT</font>
              <font color="#000000">Routes.Id </font>
              <font color="#008000">AS </font>
              <font color="#ff00ff">"@Id"</font>
              <font color="#000000">,</font>
              <font color="#000000">Routes.Title </font>
              <font color="#008000">AS </font>
              <font color="#ff00ff">"@Title"</font>
              <font color="#000000">,</font>
              <font color="#000000">(</font>
              <font color="#008000">SELECT</font>
              <font color="#000000">Step.Id </font>
              <font color="#008000">AS </font>
              <font color="#ff00ff">'@Id'</font>
              <font color="#000000">,</font>
              <font color="#000000">Step.Title </font>
              <font color="#008000">AS </font>
              <font color="#ff00ff">'@Title'</font>
              <font color="#008000">FROM</font>
              <font color="#000000">@Step </font>
              <font color="#008000">AS </font>
              <font color="#000000">Step</font>
              <font color="#008000">WHERE</font>
              <font color="#000000">Step.RouteId
      = Routes.Id</font>
              <font color="#008000">ORDER BY </font>
              <font color="#000000">Step.Sequence </font>
              <font color="#008000">ASC</font>
              <font color="#008000">FOR </font>
              <font color="#000000">XML
      PATH(</font>
              <font color="#ff00ff">'Step'</font>
              <font color="#000000">), TYPE </font>
              <font color="#000000">) </font>
              <font color="#008000">AS </font>
              <font color="#ff00ff">'Steps'</font>
              <font color="#008000">FROM </font>
              <font color="#000000">Routes</font>
              <font color="#008000">WHERE</font>
              <font color="#000000">RowNumber
      &gt; @StartIndex </font>
              <font color="#008000">AND </font>
              <font color="#000000">RowNumber
      &lt;= @EndIndex </font>
              <font color="#5f5f5f">--// BETWEEN Results in improper paging</font>
              <font color="#008000">FOR </font>
              <font color="#000000">XML
      PATH(</font>
              <font color="#ff00ff">'Route'</font>
              <font color="#000000">), ROOT(</font>
              <font color="#ff00ff">'Routes'</font>
              <font color="#000000">)</font>
            </font>
          </pre>
        </div>
        <p>
      What's great about this is that if your object model is properly designed, it's just
      a matter of deserializing the XML (using precompiled serialization binaries, of course)
      to rehydrate your data model.
   </p>
        <p>
      In this case, the output XML looks like this:
   </p>
        <div class="code">
          <pre>
            <font face="Lucida Console">
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Routes</font>
              <font color="#3040fe">&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Route
      Id</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"1" </font>
              <font color="#ff0000">Title</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"Route
      1"</font>
              <font color="#3040fe">&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Steps</font>
              <font color="#3040fe">&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Step
      Id</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"1" </font>
              <font color="#ff0000">Title</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"Step
      1.1" </font>
              <font color="#3040fe">/&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Step
      Id</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"2" </font>
              <font color="#ff0000">Title</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"Step
      1.2" </font>
              <font color="#3040fe">/&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Step
      Id</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"3" </font>
              <font color="#ff0000">Title</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"Step
      1.3" </font>
              <font color="#3040fe">/&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Step
      Id</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"4" </font>
              <font color="#ff0000">Title</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"Step
      1.4" </font>
              <font color="#3040fe">/&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Step
      Id</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"5" </font>
              <font color="#ff0000">Title</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"Step
      1.5" </font>
              <font color="#3040fe">/&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;/</font>
              <font color="#ff0000">Steps</font>
              <font color="#3040fe">&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;/</font>
              <font color="#ff0000">Route</font>
              <font color="#3040fe">&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Route
      Id</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"2" </font>
              <font color="#ff0000">Title</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"Route
      2"</font>
              <font color="#3040fe">&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Steps</font>
              <font color="#3040fe">&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Step
      Id</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"6" </font>
              <font color="#ff0000">Title</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"Step
      2.1" </font>
              <font color="#3040fe">/&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Step
      Id</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"7" </font>
              <font color="#ff0000">Title</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"Step
      2.2" </font>
              <font color="#3040fe">/&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Step
      Id</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"8" </font>
              <font color="#ff0000">Title</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"Step
      2.3" </font>
              <font color="#3040fe">/&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;/</font>
              <font color="#ff0000">Steps</font>
              <font color="#3040fe">&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;/</font>
              <font color="#ff0000">Route</font>
              <font color="#3040fe">&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Route
      Id</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"3" </font>
              <font color="#ff0000">Title</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"Route
      3"</font>
              <font color="#3040fe">&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Steps</font>
              <font color="#3040fe">&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;</font>
              <font color="#ff0000">Step
      Id</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"9" </font>
              <font color="#ff0000">Title</font>
              <font color="#3040fe">=</font>
              <font color="#ff00ff">"Step
      3.1" </font>
              <font color="#3040fe">/&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;/</font>
              <font color="#ff0000">Steps</font>
              <font color="#3040fe">&gt;</font>
              <font color="#000000">
              </font>
              <font color="#3040fe">&lt;/</font>
              <font color="#ff0000">Route</font>
              <font color="#3040fe">&gt;</font>
              <font color="#3040fe">&lt;/</font>
              <font color="#ff0000">Routes</font>
              <font color="#3040fe">&gt;</font>
            </font>
          </pre>
        </div>
        <p>
      Next, you'll need some simple code to deserialize the XML to make it useful:
   </p>
        <div class="code">
          <pre>
            <font face="Lucida Console,monospace">
              <font color="#0000ff">using </font>
              <font color="#008080">System</font>
              <font color="#000000">;</font>
              <font color="#0000ff">using </font>
              <font color="#008080">System</font>
              <font color="#000000">.</font>
              <font color="#008080">Collections</font>
              <font color="#000000">.Generic;</font>
              <font color="#0000ff">using </font>
              <font color="#008080">System</font>
              <font color="#000000">.</font>
              <font color="#008080">Collections</font>
              <font color="#000000">.ObjectModel;</font>
              <font color="#0000ff">using </font>
              <font color="#008080">System</font>
              <font color="#000000">.</font>
              <font color="#008080">IO</font>
              <font color="#000000">;</font>
              <font color="#0000ff">using </font>
              <font color="#008080">System</font>
              <font color="#000000">.</font>
              <font color="#008080">Xml</font>
              <font color="#000000">.</font>
              <font color="#008080">Serialization</font>
              <font color="#000000">;</font>
              <font color="#0000ff">namespace </font>
              <font color="#000000">XmlDeserialization
      {</font>
              <font color="#0000ff">internal class </font>
              <font color="#000000">Program
      {</font>
              <font color="#0000ff">private static void </font>
              <font color="#000000">Main(</font>
              <font color="#0000ff">string</font>
              <font color="#000000">[]
      args) {</font>
              <font color="#0000ff">string </font>
              <font color="#000000">xml = ...; </font>
              <font color="#008000">//
      XML string here</font>
              <font color="#000000">RouteList routes = </font>
              <font color="#0000ff">new </font>
              <font color="#000000">RouteList(xml);</font>
              <font color="#808000">Console</font>
              <font color="#000000">.Out.WriteLine(routes.Count);</font>
              <font color="#0000ff">foreach</font>
              <font color="#000000">(Route
      route </font>
              <font color="#0000ff">in </font>
              <font color="#000000">routes) {</font>
              <font color="#808000">Console</font>
              <font color="#000000">.Out.WriteLine(</font>
              <font color="#ff00ff">"
      + Route: {0}"</font>
              <font color="#000000">, route.Id);</font>
              <font color="#0000ff">foreach</font>
              <font color="#000000">(Step
      step </font>
              <font color="#0000ff">in </font>
              <font color="#000000">route.Steps) {</font>
              <font color="#808000">Console</font>
              <font color="#000000">.Out.WriteLine(</font>
              <font color="#ff00ff">"
      + Step: {0}"</font>
              <font color="#000000">, step.Id);</font>
              <font color="#000000">}</font>
              <font color="#000000">}</font>
              <font color="#000000">}</font>
              <font color="#000000">}</font>
              <font color="#0000ff">public
      abstract class </font>
              <font color="#000000">XmlDeserializingList&lt;Titem&gt; : List&lt;Titem&gt;
      {</font>
              <font color="#0000ff">protected </font>
              <font color="#000000">XmlDeserializingList()
      { }</font>
              <font color="#0000ff">protected </font>
              <font color="#000000">XmlDeserializingList(</font>
              <font color="#0000ff">string </font>
              <font color="#000000">xml)
      {</font>
              <font color="#808000">StringReader </font>
              <font color="#000000">reader = </font>
              <font color="#0000ff">new </font>
              <font color="#808000">StringReader</font>
              <font color="#000000">(xml);</font>
              <font color="#808000">XmlSerializer </font>
              <font color="#000000">serializer
      = </font>
              <font color="#0000ff">new </font>
              <font color="#808000">XmlSerializer</font>
              <font color="#000000">(GetType());</font>
              <font color="#000000">XmlDeserializingList&lt;Titem&gt;
      items = (XmlDeserializingList&lt;Titem&gt;)serializer.Deserialize(reader);</font>
              <font color="#000000">AddRange(items);</font>
              <font color="#000000">}</font>
              <font color="#000000">}</font>
              <font color="#000000">[XmlRoot(</font>
              <font color="#ff00ff">"Routes"</font>
              <font color="#000000">)]</font>
              <font color="#0000ff">public
      class </font>
              <font color="#000000">RouteList : XmlDeserializingList&lt;Route&gt; {</font>
              <font color="#0000ff">public </font>
              <font color="#000000">RouteList()
      {}</font>
              <font color="#0000ff">public </font>
              <font color="#000000">RouteList(</font>
              <font color="#0000ff">string </font>
              <font color="#000000">xml)
      : </font>
              <font color="#0000ff">base</font>
              <font color="#000000">(xml) {</font>
              <font color="#000000">}</font>
              <font color="#000000">}</font>
              <font color="#000000">[Serializable]</font>
              <font color="#0000ff">public
      class </font>
              <font color="#000000">Route {</font>
              <font color="#0000ff">private int </font>
              <font color="#000000">id;</font>
              <font color="#0000ff">private
      string </font>
              <font color="#000000">title;</font>
              <font color="#0000ff">private </font>
              <font color="#000000">Collection&lt;Step&gt;
      steps;</font>
              <font color="#000000">[</font>
              <font color="#808000">XmlAttribute</font>
              <font color="#000000">]</font>
              <font color="#0000ff">public
      int </font>
              <font color="#000000">Id {</font>
              <font color="#000000">get { </font>
              <font color="#0000ff">return </font>
              <font color="#000000">id;
      }</font>
              <font color="#000000">set { id = value; }</font>
              <font color="#000000">}</font>
              <font color="#000000">[</font>
              <font color="#808000">XmlAttribute</font>
              <font color="#000000">]</font>
              <font color="#0000ff">public
      string </font>
              <font color="#000000">Title {</font>
              <font color="#000000">get { </font>
              <font color="#0000ff">return </font>
              <font color="#000000">title;
      }</font>
              <font color="#000000">set { title = value; }</font>
              <font color="#000000">}</font>
              <font color="#000000">[XmlArray(</font>
              <font color="#ff00ff">"Steps"</font>
              <font color="#000000">),
      XmlArrayItem(</font>
              <font color="#ff00ff">"Step"</font>
              <font color="#000000">, </font>
              <font color="#0000ff">typeof</font>
              <font color="#000000">(Step))]</font>
              <font color="#0000ff">public </font>
              <font color="#000000">Collection&lt;Step&gt;
      Steps {</font>
              <font color="#000000">get { </font>
              <font color="#0000ff">return </font>
              <font color="#000000">steps;
      }</font>
              <font color="#000000">set { steps = value; }</font>
              <font color="#000000">}</font>
              <font color="#000000">}</font>
              <font color="#000000">[Serializable]</font>
              <font color="#0000ff">public
      class </font>
              <font color="#000000">Step {</font>
              <font color="#0000ff">private int </font>
              <font color="#000000">id;</font>
              <font color="#0000ff">private
      string </font>
              <font color="#000000">title;</font>
              <font color="#000000">[</font>
              <font color="#808000">XmlAttribute</font>
              <font color="#000000">]</font>
              <font color="#0000ff">public
      int </font>
              <font color="#000000">Id {</font>
              <font color="#000000">get { </font>
              <font color="#0000ff">return </font>
              <font color="#000000">id;
      }</font>
              <font color="#000000">set { id = value; }</font>
              <font color="#000000">}</font>
              <font color="#000000">[</font>
              <font color="#808000">XmlAttribute</font>
              <font color="#000000">]</font>
              <font color="#0000ff">public
      string </font>
              <font color="#000000">Title {</font>
              <font color="#000000">get { </font>
              <font color="#0000ff">return </font>
              <font color="#000000">title;
      }</font>
              <font color="#000000">set { title = value; }</font>
              <font color="#000000">}</font>
              <font color="#000000">}</font>
              <font color="#000000">}</font>
            </font>
          </pre>
        </div>
        <p>
      It might even be useful to add some abstract methods (and properties to support it)
      to <span class="code">GetNextPage()</span></p>
        <img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=211c4129-4237-478c-acde-8abaabbad067" />
      </body>
      <title>FOR XML Needs More Love</title>
      <guid>http://www.charliedigital.com/PermaLink,guid,211c4129-4237-478c-acde-8abaabbad067.aspx</guid>
      <link>http://www.charliedigital.com/PermaLink,guid,211c4129-4237-478c-acde-8abaabbad067.aspx</link>
      <pubDate>Thu, 24 Apr 2008 17:55:27 GMT</pubDate>
      <description>&lt;p&gt;
   I'm constantly amazed by the number of developers who have never worked with &lt;span class=code&gt;FOR
   XML EXPLICIT&lt;/span&gt; and the new &lt;span class=code&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms345137.aspx"&gt;FOR
   XML PATH&lt;/a&gt;&lt;/span&gt;.&amp;nbsp; If &lt;em&gt;I&lt;/em&gt; were designing data access, it would be my
   go-to commands for building queries for complex data structures (nested &lt;span class=code&gt;DataReaders&lt;/span&gt;?&amp;nbsp;
   yuck!).
&lt;/p&gt;
&lt;p&gt;
   In the past, to support paging using &lt;span class=code&gt;FOR XML EXPLICIT&lt;/span&gt; queries
   took tons of lines to accomplish (although there is something about the whole &lt;em&gt;explicitness&lt;/em&gt; that
   makes it surprisingly legible).&amp;nbsp; Now with the fancy pants &lt;span class=code&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms186734.aspx"&gt;ROW_NUMBER&lt;/a&gt;&lt;/span&gt; function
   in SQL along with CTEs, a hundred line query can be written with maybe 15-20 lines.
&lt;/p&gt;
&lt;p&gt;
   Here's a simple&amp;nbsp;example that you can copy+paste and run:
&lt;/p&gt;
&lt;div class=code&gt;&lt;pre&gt;&lt;font face="Lucida Console"&gt;&lt;font color=#5f5f5f&gt;/* &lt;/font&gt; &lt;font color=#5f5f5f&gt;Demonstrates
   usage of ROW_NUMBER and FOR XML PATH to create &lt;/font&gt; &lt;font color=#5f5f5f&gt;pageable
   XML results queries.&lt;/font&gt; &lt;font color=#5f5f5f&gt;In this case, the key is to page only
   on the Route objects.&lt;/font&gt; &lt;font color=#5f5f5f&gt;*/&lt;/font&gt; &lt;font color=#5f5f5f&gt;--//
   Mock Route table&lt;/font&gt; &lt;font color=#008000&gt;DECLARE &lt;/font&gt;&lt;font color=#000000&gt;@Route &lt;/font&gt;&lt;font color=#008000&gt;TABLE &lt;/font&gt;&lt;font color=#000000&gt;(&lt;/font&gt; &lt;font color=#000000&gt;Id &lt;/font&gt;&lt;font color=#0000ff&gt;int&lt;/font&gt;&lt;font color=#000000&gt;,&lt;/font&gt; &lt;font color=#000000&gt;Title &lt;/font&gt;&lt;font color=#0000ff&gt;varchar&lt;/font&gt;&lt;font color=#000000&gt;(100)&lt;/font&gt; &lt;font color=#000000&gt;)&lt;/font&gt; &lt;font color=#5f5f5f&gt;--//
   Mock Step table&lt;/font&gt; &lt;font color=#008000&gt;DECLARE &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;TABLE &lt;/font&gt;&lt;font color=#000000&gt;(&lt;/font&gt; &lt;font color=#000000&gt;Id &lt;/font&gt;&lt;font color=#0000ff&gt;int&lt;/font&gt;&lt;font color=#000000&gt;,&lt;/font&gt; &lt;font color=#000000&gt;RouteId &lt;/font&gt;&lt;font color=#0000ff&gt;int&lt;/font&gt;&lt;font color=#000000&gt;,&lt;/font&gt; &lt;font color=#000000&gt;Title &lt;/font&gt;&lt;font color=#0000ff&gt;varchar&lt;/font&gt;&lt;font color=#000000&gt;(100),&lt;/font&gt; &lt;font color=#000000&gt;Sequence &lt;/font&gt;&lt;font color=#0000ff&gt;int&lt;/font&gt; &lt;font color=#000000&gt;)&lt;/font&gt; &lt;font color=#5f5f5f&gt;--//
   Insert mock data&lt;/font&gt; &lt;font color=#008000&gt;INSERT INTO &lt;/font&gt;&lt;font color=#000000&gt;@Route &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(1, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Route
   1'&lt;/font&gt;&lt;font color=#000000&gt;)&lt;/font&gt; &lt;font color=#008000&gt;INSERT INTO &lt;/font&gt;&lt;font color=#000000&gt;@Route &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(2, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Route
   2'&lt;/font&gt;&lt;font color=#000000&gt;)&lt;/font&gt; &lt;font color=#008000&gt;INSERT INTO &lt;/font&gt;&lt;font color=#000000&gt;@Route &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(3, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Route
   3'&lt;/font&gt;&lt;font color=#000000&gt;)&lt;/font&gt; &lt;font color=#008000&gt;INSERT INTO &lt;/font&gt;&lt;font color=#000000&gt;@Route &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(4, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Route
   4'&lt;/font&gt;&lt;font color=#000000&gt;)&lt;/font&gt; &lt;font color=#008000&gt;INSERT INTO &lt;/font&gt;&lt;font color=#000000&gt;@Route &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(5, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Route
   5'&lt;/font&gt;&lt;font color=#000000&gt;)&lt;/font&gt; &lt;font color=#5f5f5f&gt;--// Route 1 Steps&lt;/font&gt; &lt;font color=#008000&gt;INSERT
   INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(1,
   1, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 1.1'&lt;/font&gt;&lt;font color=#000000&gt;, 1)&lt;/font&gt; &lt;font color=#008000&gt;INSERT
   INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(2,
   1, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 1.2'&lt;/font&gt;&lt;font color=#000000&gt;, 2)&lt;/font&gt; &lt;font color=#008000&gt;INSERT
   INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(3,
   1, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 1.3'&lt;/font&gt;&lt;font color=#000000&gt;, 3)&lt;/font&gt; &lt;font color=#008000&gt;INSERT
   INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(4,
   1, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 1.4'&lt;/font&gt;&lt;font color=#000000&gt;, 4)&lt;/font&gt; &lt;font color=#008000&gt;INSERT
   INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(5,
   1, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 1.5'&lt;/font&gt;&lt;font color=#000000&gt;, 5)&lt;/font&gt; &lt;font color=#5f5f5f&gt;--//
   Route 2 Steps&lt;/font&gt; &lt;font color=#008000&gt;INSERT INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(6,
   2, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 2.1'&lt;/font&gt;&lt;font color=#000000&gt;, 1)&lt;/font&gt; &lt;font color=#008000&gt;INSERT
   INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(7,
   2, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 2.2'&lt;/font&gt;&lt;font color=#000000&gt;, 2)&lt;/font&gt; &lt;font color=#008000&gt;INSERT
   INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(8,
   2, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 2.3'&lt;/font&gt;&lt;font color=#000000&gt;, 3)&lt;/font&gt; &lt;font color=#5f5f5f&gt;--//
   Route 3 Steps&lt;/font&gt; &lt;font color=#008000&gt;INSERT INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(9,
   3, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 3.1'&lt;/font&gt;&lt;font color=#000000&gt;, 1)&lt;/font&gt; &lt;font color=#5f5f5f&gt;--//
   Route 4 Steps&lt;/font&gt; &lt;font color=#008000&gt;INSERT INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(10,
   4, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 4.1'&lt;/font&gt;&lt;font color=#000000&gt;, 1)&lt;/font&gt; &lt;font color=#5f5f5f&gt;--//
   Route 5 Steps&lt;/font&gt; &lt;font color=#008000&gt;INSERT INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(11,
   5, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 5.1'&lt;/font&gt;&lt;font color=#000000&gt;, 1)&lt;/font&gt; &lt;font color=#008000&gt;INSERT
   INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(12,
   5, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 5.2'&lt;/font&gt;&lt;font color=#000000&gt;, 2)&lt;/font&gt; &lt;font color=#008000&gt;INSERT
   INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(13,
   5, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 5.3'&lt;/font&gt;&lt;font color=#000000&gt;, 3)&lt;/font&gt; &lt;font color=#008000&gt;INSERT
   INTO &lt;/font&gt;&lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;VALUES &lt;/font&gt;&lt;font color=#000000&gt;(14,
   5, &lt;/font&gt;&lt;font color=#ff00ff&gt;'Step 5.4'&lt;/font&gt;&lt;font color=#000000&gt;, 4)&lt;/font&gt; &lt;font color=#5f5f5f&gt;/*&lt;/font&gt; &lt;font color=#5f5f5f&gt;Define
   the page size.&lt;/font&gt; &lt;font color=#5f5f5f&gt; -- Add sorting and ordering later&lt;/font&gt; &lt;font color=#5f5f5f&gt;*/&lt;/font&gt; &lt;font color=#008000&gt;DECLARE &lt;/font&gt;&lt;font color=#000000&gt;@PageSize &lt;/font&gt;&lt;font color=#0000ff&gt;int&lt;/font&gt; &lt;font color=#008000&gt;DECLARE &lt;/font&gt;&lt;font color=#000000&gt;@CurrentPage &lt;/font&gt;&lt;font color=#0000ff&gt;int&lt;/font&gt; &lt;font color=#008000&gt;SET &lt;/font&gt;&lt;font color=#000000&gt;@CurrentPage
   = 0&lt;/font&gt; &lt;font color=#008000&gt;SET &lt;/font&gt;&lt;font color=#000000&gt;@PageSize = 3&lt;/font&gt; &lt;font color=#5f5f5f&gt;/*&lt;/font&gt; &lt;font color=#5f5f5f&gt;Calculate
   starting and ending row.&lt;/font&gt; &lt;font color=#5f5f5f&gt;*/&lt;/font&gt; &lt;font color=#008000&gt;DECLARE &lt;/font&gt;&lt;font color=#000000&gt;@StartIndex &lt;/font&gt;&lt;font color=#0000ff&gt;int&lt;/font&gt; &lt;font color=#008000&gt;DECLARE &lt;/font&gt;&lt;font color=#000000&gt;@EndIndex &lt;/font&gt;&lt;font color=#0000ff&gt;int&lt;/font&gt; &lt;font color=#008000&gt;SET &lt;/font&gt;&lt;font color=#000000&gt;@StartIndex
   = @CurrentPage * @PageSize&lt;/font&gt; &lt;font color=#008000&gt;SET &lt;/font&gt;&lt;font color=#000000&gt;@EndIndex
   = @StartIndex + @PageSize&lt;/font&gt; &lt;font color=#000000&gt;; &lt;/font&gt;&lt;font color=#5f5f5f&gt;--//
   Need to terminate with a semicolon for CTE &lt;/font&gt; &lt;font color=#5f5f5f&gt;/*&lt;/font&gt; &lt;font color=#5f5f5f&gt;Perform
   core XML select&lt;/font&gt; &lt;font color=#5f5f5f&gt;*/&lt;/font&gt; &lt;font color=#008000&gt;WITH &lt;/font&gt;&lt;font color=#000000&gt;Routes &lt;/font&gt;&lt;font color=#008000&gt;AS &lt;/font&gt;&lt;font color=#000000&gt;(&lt;/font&gt; &lt;font color=#008000&gt;SELECT &lt;/font&gt; &lt;font color=#000000&gt;*,&lt;/font&gt; &lt;font color=#000000&gt;ROW_NUMBER()
   OVER (&lt;/font&gt;&lt;font color=#008000&gt;ORDER BY &lt;/font&gt;&lt;font color=#000000&gt;Id) &lt;/font&gt;&lt;font color=#008000&gt;AS &lt;/font&gt;&lt;font color=#ff00ff&gt;'RowNumber'&lt;/font&gt; &lt;font color=#008000&gt;FROM&lt;/font&gt; &lt;font color=#000000&gt;@Route&lt;/font&gt; &lt;font color=#000000&gt;)&lt;/font&gt; &lt;font color=#008000&gt;SELECT&lt;/font&gt; &lt;font color=#000000&gt;Routes.Id &lt;/font&gt;&lt;font color=#008000&gt;AS &lt;/font&gt;&lt;font color=#ff00ff&gt;"@Id"&lt;/font&gt;&lt;font color=#000000&gt;,&lt;/font&gt; &lt;font color=#000000&gt;Routes.Title &lt;/font&gt;&lt;font color=#008000&gt;AS &lt;/font&gt;&lt;font color=#ff00ff&gt;"@Title"&lt;/font&gt;&lt;font color=#000000&gt;,&lt;/font&gt; &lt;font color=#000000&gt;(&lt;/font&gt; &lt;font color=#008000&gt;SELECT&lt;/font&gt; &lt;font color=#000000&gt;Step.Id &lt;/font&gt;&lt;font color=#008000&gt;AS &lt;/font&gt;&lt;font color=#ff00ff&gt;'@Id'&lt;/font&gt;&lt;font color=#000000&gt;,&lt;/font&gt; &lt;font color=#000000&gt;Step.Title &lt;/font&gt;&lt;font color=#008000&gt;AS &lt;/font&gt;&lt;font color=#ff00ff&gt;'@Title'&lt;/font&gt; &lt;font color=#008000&gt;FROM&lt;/font&gt; &lt;font color=#000000&gt;@Step &lt;/font&gt;&lt;font color=#008000&gt;AS &lt;/font&gt;&lt;font color=#000000&gt;Step&lt;/font&gt; &lt;font color=#008000&gt;WHERE&lt;/font&gt; &lt;font color=#000000&gt;Step.RouteId
   = Routes.Id&lt;/font&gt; &lt;font color=#008000&gt;ORDER BY &lt;/font&gt; &lt;font color=#000000&gt;Step.Sequence &lt;/font&gt;&lt;font color=#008000&gt;ASC&lt;/font&gt; &lt;font color=#008000&gt;FOR &lt;/font&gt;&lt;font color=#000000&gt;XML
   PATH(&lt;/font&gt;&lt;font color=#ff00ff&gt;'Step'&lt;/font&gt;&lt;font color=#000000&gt;), TYPE &lt;/font&gt; &lt;font color=#000000&gt;) &lt;/font&gt;&lt;font color=#008000&gt;AS &lt;/font&gt;&lt;font color=#ff00ff&gt;'Steps'&lt;/font&gt; &lt;font color=#008000&gt;FROM &lt;/font&gt; &lt;font color=#000000&gt;Routes&lt;/font&gt; &lt;font color=#008000&gt;WHERE&lt;/font&gt; &lt;font color=#000000&gt;RowNumber
   &amp;gt; @StartIndex &lt;/font&gt;&lt;font color=#008000&gt;AND &lt;/font&gt;&lt;font color=#000000&gt;RowNumber
   &amp;lt;= @EndIndex &lt;/font&gt;&lt;font color=#5f5f5f&gt;--// BETWEEN Results in improper paging&lt;/font&gt; &lt;font color=#008000&gt;FOR &lt;/font&gt;&lt;font color=#000000&gt;XML
   PATH(&lt;/font&gt;&lt;font color=#ff00ff&gt;'Route'&lt;/font&gt;&lt;font color=#000000&gt;), ROOT(&lt;/font&gt;&lt;font color=#ff00ff&gt;'Routes'&lt;/font&gt;&lt;font color=#000000&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
   What's great about this is that if your object model is properly designed, it's just
   a matter of deserializing the XML (using precompiled serialization binaries, of course)
   to rehydrate your data model.
&lt;/p&gt;
&lt;p&gt;
   In this case, the output XML looks like this:
&lt;/p&gt;
&lt;div class=code&gt;&lt;pre&gt;&lt;font face="Lucida Console"&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Routes&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Route
   Id&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"1" &lt;/font&gt;&lt;font color=#ff0000&gt;Title&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"Route
   1"&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Steps&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Step
   Id&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"1" &lt;/font&gt;&lt;font color=#ff0000&gt;Title&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"Step
   1.1" &lt;/font&gt;&lt;font color=#3040fe&gt;/&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Step
   Id&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"2" &lt;/font&gt;&lt;font color=#ff0000&gt;Title&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"Step
   1.2" &lt;/font&gt;&lt;font color=#3040fe&gt;/&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Step
   Id&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"3" &lt;/font&gt;&lt;font color=#ff0000&gt;Title&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"Step
   1.3" &lt;/font&gt;&lt;font color=#3040fe&gt;/&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Step
   Id&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"4" &lt;/font&gt;&lt;font color=#ff0000&gt;Title&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"Step
   1.4" &lt;/font&gt;&lt;font color=#3040fe&gt;/&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Step
   Id&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"5" &lt;/font&gt;&lt;font color=#ff0000&gt;Title&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"Step
   1.5" &lt;/font&gt;&lt;font color=#3040fe&gt;/&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;/&lt;/font&gt;&lt;font color=#ff0000&gt;Steps&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;/&lt;/font&gt;&lt;font color=#ff0000&gt;Route&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Route
   Id&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"2" &lt;/font&gt;&lt;font color=#ff0000&gt;Title&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"Route
   2"&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Steps&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Step
   Id&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"6" &lt;/font&gt;&lt;font color=#ff0000&gt;Title&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"Step
   2.1" &lt;/font&gt;&lt;font color=#3040fe&gt;/&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Step
   Id&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"7" &lt;/font&gt;&lt;font color=#ff0000&gt;Title&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"Step
   2.2" &lt;/font&gt;&lt;font color=#3040fe&gt;/&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Step
   Id&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"8" &lt;/font&gt;&lt;font color=#ff0000&gt;Title&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"Step
   2.3" &lt;/font&gt;&lt;font color=#3040fe&gt;/&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;/&lt;/font&gt;&lt;font color=#ff0000&gt;Steps&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;/&lt;/font&gt;&lt;font color=#ff0000&gt;Route&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Route
   Id&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"3" &lt;/font&gt;&lt;font color=#ff0000&gt;Title&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"Route
   3"&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Steps&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;&lt;/font&gt;&lt;font color=#ff0000&gt;Step
   Id&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"9" &lt;/font&gt;&lt;font color=#ff0000&gt;Title&lt;/font&gt;&lt;font color=#3040fe&gt;=&lt;/font&gt;&lt;font color=#ff00ff&gt;"Step
   3.1" &lt;/font&gt;&lt;font color=#3040fe&gt;/&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;/&lt;/font&gt;&lt;font color=#ff0000&gt;Steps&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt; &lt;font color=#000000&gt; &lt;/font&gt;&lt;font color=#3040fe&gt;&amp;lt;/&lt;/font&gt;&lt;font color=#ff0000&gt;Route&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt; &lt;font color=#3040fe&gt;&amp;lt;/&lt;/font&gt;&lt;font color=#ff0000&gt;Routes&lt;/font&gt;&lt;font color=#3040fe&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
   Next, you'll need some simple code to deserialize the XML to make it useful:
&lt;/p&gt;
&lt;div class=code&gt;&lt;pre&gt;&lt;font face="Lucida Console,monospace"&gt;&lt;font color=#0000ff&gt;using &lt;/font&gt;&lt;font color=#008080&gt;System&lt;/font&gt;&lt;font color=#000000&gt;;&lt;/font&gt; &lt;font color=#0000ff&gt;using &lt;/font&gt;&lt;font color=#008080&gt;System&lt;/font&gt;&lt;font color=#000000&gt;.&lt;/font&gt;&lt;font color=#008080&gt;Collections&lt;/font&gt;&lt;font color=#000000&gt;.Generic;&lt;/font&gt; &lt;font color=#0000ff&gt;using &lt;/font&gt;&lt;font color=#008080&gt;System&lt;/font&gt;&lt;font color=#000000&gt;.&lt;/font&gt;&lt;font color=#008080&gt;Collections&lt;/font&gt;&lt;font color=#000000&gt;.ObjectModel;&lt;/font&gt; &lt;font color=#0000ff&gt;using &lt;/font&gt;&lt;font color=#008080&gt;System&lt;/font&gt;&lt;font color=#000000&gt;.&lt;/font&gt;&lt;font color=#008080&gt;IO&lt;/font&gt;&lt;font color=#000000&gt;;&lt;/font&gt; &lt;font color=#0000ff&gt;using &lt;/font&gt;&lt;font color=#008080&gt;System&lt;/font&gt;&lt;font color=#000000&gt;.&lt;/font&gt;&lt;font color=#008080&gt;Xml&lt;/font&gt;&lt;font color=#000000&gt;.&lt;/font&gt;&lt;font color=#008080&gt;Serialization&lt;/font&gt;&lt;font color=#000000&gt;;&lt;/font&gt; &lt;font color=#0000ff&gt;namespace &lt;/font&gt;&lt;font color=#000000&gt;XmlDeserialization
   {&lt;/font&gt; &lt;font color=#0000ff&gt;internal class &lt;/font&gt;&lt;font color=#000000&gt;Program {&lt;/font&gt; &lt;font color=#0000ff&gt;private
   static void &lt;/font&gt;&lt;font color=#000000&gt;Main(&lt;/font&gt;&lt;font color=#0000ff&gt;string&lt;/font&gt;&lt;font color=#000000&gt;[]
   args) {&lt;/font&gt; &lt;font color=#0000ff&gt;string &lt;/font&gt;&lt;font color=#000000&gt;xml = ...; &lt;/font&gt;&lt;font color=#008000&gt;//
   XML string here&lt;/font&gt; &lt;font color=#000000&gt;RouteList routes = &lt;/font&gt;&lt;font color=#0000ff&gt;new &lt;/font&gt;&lt;font color=#000000&gt;RouteList(xml);&lt;/font&gt; &lt;font color=#808000&gt;Console&lt;/font&gt;&lt;font color=#000000&gt;.Out.WriteLine(routes.Count);&lt;/font&gt; &lt;font color=#0000ff&gt;foreach&lt;/font&gt;&lt;font color=#000000&gt;(Route
   route &lt;/font&gt;&lt;font color=#0000ff&gt;in &lt;/font&gt;&lt;font color=#000000&gt;routes) {&lt;/font&gt; &lt;font color=#808000&gt;Console&lt;/font&gt;&lt;font color=#000000&gt;.Out.WriteLine(&lt;/font&gt;&lt;font color=#ff00ff&gt;"
   + Route: {0}"&lt;/font&gt;&lt;font color=#000000&gt;, route.Id);&lt;/font&gt; &lt;font color=#0000ff&gt;foreach&lt;/font&gt;&lt;font color=#000000&gt;(Step
   step &lt;/font&gt;&lt;font color=#0000ff&gt;in &lt;/font&gt;&lt;font color=#000000&gt;route.Steps) {&lt;/font&gt; &lt;font color=#808000&gt;Console&lt;/font&gt;&lt;font color=#000000&gt;.Out.WriteLine(&lt;/font&gt;&lt;font color=#ff00ff&gt;"
   + Step: {0}"&lt;/font&gt;&lt;font color=#000000&gt;, step.Id);&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#0000ff&gt;public
   abstract class &lt;/font&gt;&lt;font color=#000000&gt;XmlDeserializingList&amp;lt;Titem&amp;gt; : List&amp;lt;Titem&amp;gt;
   {&lt;/font&gt; &lt;font color=#0000ff&gt;protected &lt;/font&gt;&lt;font color=#000000&gt;XmlDeserializingList()
   { }&lt;/font&gt; &lt;font color=#0000ff&gt;protected &lt;/font&gt;&lt;font color=#000000&gt;XmlDeserializingList(&lt;/font&gt;&lt;font color=#0000ff&gt;string &lt;/font&gt;&lt;font color=#000000&gt;xml)
   {&lt;/font&gt; &lt;font color=#808000&gt;StringReader &lt;/font&gt;&lt;font color=#000000&gt;reader = &lt;/font&gt;&lt;font color=#0000ff&gt;new &lt;/font&gt;&lt;font color=#808000&gt;StringReader&lt;/font&gt;&lt;font color=#000000&gt;(xml);&lt;/font&gt; &lt;font color=#808000&gt;XmlSerializer &lt;/font&gt;&lt;font color=#000000&gt;serializer
   = &lt;/font&gt;&lt;font color=#0000ff&gt;new &lt;/font&gt;&lt;font color=#808000&gt;XmlSerializer&lt;/font&gt;&lt;font color=#000000&gt;(GetType());&lt;/font&gt; &lt;font color=#000000&gt;XmlDeserializingList&amp;lt;Titem&amp;gt;
   items = (XmlDeserializingList&amp;lt;Titem&amp;gt;)serializer.Deserialize(reader);&lt;/font&gt; &lt;font color=#000000&gt;AddRange(items);&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;[XmlRoot(&lt;/font&gt;&lt;font color=#ff00ff&gt;"Routes"&lt;/font&gt;&lt;font color=#000000&gt;)]&lt;/font&gt; &lt;font color=#0000ff&gt;public
   class &lt;/font&gt;&lt;font color=#000000&gt;RouteList : XmlDeserializingList&amp;lt;Route&amp;gt; {&lt;/font&gt; &lt;font color=#0000ff&gt;public &lt;/font&gt;&lt;font color=#000000&gt;RouteList()
   {}&lt;/font&gt; &lt;font color=#0000ff&gt;public &lt;/font&gt;&lt;font color=#000000&gt;RouteList(&lt;/font&gt;&lt;font color=#0000ff&gt;string &lt;/font&gt;&lt;font color=#000000&gt;xml)
   : &lt;/font&gt;&lt;font color=#0000ff&gt;base&lt;/font&gt;&lt;font color=#000000&gt;(xml) {&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;[Serializable]&lt;/font&gt; &lt;font color=#0000ff&gt;public
   class &lt;/font&gt;&lt;font color=#000000&gt;Route {&lt;/font&gt; &lt;font color=#0000ff&gt;private int &lt;/font&gt;&lt;font color=#000000&gt;id;&lt;/font&gt; &lt;font color=#0000ff&gt;private
   string &lt;/font&gt;&lt;font color=#000000&gt;title;&lt;/font&gt; &lt;font color=#0000ff&gt;private &lt;/font&gt;&lt;font color=#000000&gt;Collection&amp;lt;Step&amp;gt;
   steps;&lt;/font&gt; &lt;font color=#000000&gt;[&lt;/font&gt;&lt;font color=#808000&gt;XmlAttribute&lt;/font&gt;&lt;font color=#000000&gt;]&lt;/font&gt; &lt;font color=#0000ff&gt;public
   int &lt;/font&gt;&lt;font color=#000000&gt;Id {&lt;/font&gt; &lt;font color=#000000&gt;get { &lt;/font&gt;&lt;font color=#0000ff&gt;return &lt;/font&gt;&lt;font color=#000000&gt;id;
   }&lt;/font&gt; &lt;font color=#000000&gt;set { id = value; }&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;[&lt;/font&gt;&lt;font color=#808000&gt;XmlAttribute&lt;/font&gt;&lt;font color=#000000&gt;]&lt;/font&gt; &lt;font color=#0000ff&gt;public
   string &lt;/font&gt;&lt;font color=#000000&gt;Title {&lt;/font&gt; &lt;font color=#000000&gt;get { &lt;/font&gt;&lt;font color=#0000ff&gt;return &lt;/font&gt;&lt;font color=#000000&gt;title;
   }&lt;/font&gt; &lt;font color=#000000&gt;set { title = value; }&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;[XmlArray(&lt;/font&gt;&lt;font color=#ff00ff&gt;"Steps"&lt;/font&gt;&lt;font color=#000000&gt;),
   XmlArrayItem(&lt;/font&gt;&lt;font color=#ff00ff&gt;"Step"&lt;/font&gt;&lt;font color=#000000&gt;, &lt;/font&gt;&lt;font color=#0000ff&gt;typeof&lt;/font&gt;&lt;font color=#000000&gt;(Step))]&lt;/font&gt; &lt;font color=#0000ff&gt;public &lt;/font&gt;&lt;font color=#000000&gt;Collection&amp;lt;Step&amp;gt;
   Steps {&lt;/font&gt; &lt;font color=#000000&gt;get { &lt;/font&gt;&lt;font color=#0000ff&gt;return &lt;/font&gt;&lt;font color=#000000&gt;steps;
   }&lt;/font&gt; &lt;font color=#000000&gt;set { steps = value; }&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;[Serializable]&lt;/font&gt; &lt;font color=#0000ff&gt;public
   class &lt;/font&gt;&lt;font color=#000000&gt;Step {&lt;/font&gt; &lt;font color=#0000ff&gt;private int &lt;/font&gt;&lt;font color=#000000&gt;id;&lt;/font&gt; &lt;font color=#0000ff&gt;private
   string &lt;/font&gt;&lt;font color=#000000&gt;title;&lt;/font&gt; &lt;font color=#000000&gt;[&lt;/font&gt;&lt;font color=#808000&gt;XmlAttribute&lt;/font&gt;&lt;font color=#000000&gt;]&lt;/font&gt; &lt;font color=#0000ff&gt;public
   int &lt;/font&gt;&lt;font color=#000000&gt;Id {&lt;/font&gt; &lt;font color=#000000&gt;get { &lt;/font&gt;&lt;font color=#0000ff&gt;return &lt;/font&gt;&lt;font color=#000000&gt;id;
   }&lt;/font&gt; &lt;font color=#000000&gt;set { id = value; }&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;[&lt;/font&gt;&lt;font color=#808000&gt;XmlAttribute&lt;/font&gt;&lt;font color=#000000&gt;]&lt;/font&gt; &lt;font color=#0000ff&gt;public
   string &lt;/font&gt;&lt;font color=#000000&gt;Title {&lt;/font&gt; &lt;font color=#000000&gt;get { &lt;/font&gt;&lt;font color=#0000ff&gt;return &lt;/font&gt;&lt;font color=#000000&gt;title;
   }&lt;/font&gt; &lt;font color=#000000&gt;set { title = value; }&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt; &lt;font color=#000000&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
   It might even be useful to add some abstract methods (and properties to support it)
   to &lt;span class="code"&gt;GetNextPage()&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=211c4129-4237-478c-acde-8abaabbad067" /&gt;</description>
      <comments>http://www.charliedigital.com/CommentView,guid,211c4129-4237-478c-acde-8abaabbad067.aspx</comments>
      <category>SQL Server</category>
    </item>
    <item>
      <trackback:ping>http://www.charliedigital.com/Trackback.aspx?guid=66d40551-2809-4fc6-bbfc-1d73d5c43779</trackback:ping>
      <pingback:server>http://www.charliedigital.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.charliedigital.com/PermaLink,guid,66d40551-2809-4fc6-bbfc-1d73d5c43779.aspx</pingback:target>
      <dc:creator>cchen@charliedigital.com (Charles Chen)</dc:creator>
      <wfw:comment>http://www.charliedigital.com/CommentView,guid,66d40551-2809-4fc6-bbfc-1d73d5c43779.aspx</wfw:comment>
      <wfw:commentRss>http://www.charliedigital.com/SyndicationService.asmx/GetEntryCommentsRss?guid=66d40551-2809-4fc6-bbfc-1d73d5c43779</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      SharePonit layout apps (as I call them) are the missing link in most developer's understanding
      of SharePoint and why it seems like it can be a pain in the butt as a development
      platform.  As <a href="http://www.charliedigital.com/PermaLink,guid,d06bde93-9fa9-4381-af42-0ee9d1330d63.aspx">I've
      discussed previously</a>, SharePoint development only deviates from regular ASP.NET
      development ever so slightly.  A bit of creativity and ingenuity easily overcomes
      most hurdles.
   </p>
        <p>
      As I'm doing development in the area, I'd like to help shed some light on the mystery
      of it all and show how developers and SharePoint can work together in harmony :-)
   </p>
        <p>
      One of the first steps to making happy with SharePoint when working with layout pages
      is to nuke the SharePoint CSS which creates weird padding around the main work area. 
      I'm sure it may have <em>some</em> purpose, but it's irrelevant for us at the moment.
   </p>
        <p>
      Let's take a look.
   </p>
        <p>
      In the following screen, I've added a &lt;div/&gt; element with a one pixel, black
      border with width and height set to 100% (this is in IE7 and it looks about the same
      in FF2).
   </p>
        <p style="TEXT-ALIGN: center">
          <img class="thumb" onclick="ShowFullSize(this)" src="http://www.charliedigital.com/content/binary/ugly-whitespace_t.png" border="0" />
        </p>
        <p>
      Notice the fat white padding on the top and the right.  This is useless and ugly. 
      Not only that, we didn't acheive the 100% height that we'd like to.  We can nuke
      it with some CSS:
   </p>
        <div class="code">
          <pre>
            <font face="Lucida Console">
              <font color="#555555">/*--- override
      WSS styles ---*/</font>
              <font color="#e87400">body { </font>
              <font color="#0000ff">height: </font>
              <font color="#e87400">100%;
      }</font>
              <font color="#e87400">.ms-formareaframe { </font>
              <font color="#0000ff">padding: </font>
              <font color="#e87400">2px
      4px 4px 4px; </font>
              <font color="#0000ff">background: </font>
              <font color="#e87400">#fff; </font>
              <font color="#0000ff">height:</font>
              <font color="#e87400">100%;
      }</font>
              <font color="#e87400">.ms-propertysheet { </font>
              <font color="#0000ff">height: </font>
              <font color="#e87400">100%;
      }</font>
              <font color="#e87400">#onetidMainBodyPadding { </font>
              <font color="#0000ff">height: </font>
              <font color="#e87400">0px;
      }</font>
              <font color="#e87400">#onetidMainBodyPadding img { </font>
              <font color="#0000ff">height: </font>
              <font color="#e87400">0px; </font>
              <font color="#0000ff">display: </font>
              <font color="#ff0000">none</font>
              <font color="#e87400">;
      }</font>
              <font color="#e87400">#onetidYPadding { </font>
              <font color="#0000ff">width: </font>
              <font color="#e87400">0px;
      }</font>
              <font color="#e87400">#onetidYPadding img { </font>
              <font color="#0000ff">width: </font>
              <font color="#e87400">0px; </font>
              <font color="#0000ff">display: </font>
              <font color="#ff0000">none</font>
              <font color="#e87400">;
      }</font>
            </font>
          </pre>
        </div>
        <p>
      And here's the result:
   </p>
        <p style="TEXT-ALIGN: center">
          <img class="thumb" onclick="ShowFullSize(this)" src="http://www.charliedigital.com/content/binary/nuked-whitespace_t.png" border="0" />
        </p>
        <p>
      Bingo!  It looks kind of the same in FF2 (FF2 overdraws the 100% declaration
      and cuts off the bottom and right borders; this does require some CSS hackery
      to fix).
   </p>
        <p>
      But the big picture is that now we have a blank slate with which to integrate with
      SharePoint.  You get all of the benefits of SharePoint authentication, document
      management, profiling, and so on just by putting your ASP.NET application into SharePoint
      as a layout page.  Development is easier than it would seem since the package,
      during development, only has to be deployed once.  Otherwise, all of the files
      can be deployed to SharePoint using an automated XCOPY or manually.  In some
      cases, for example working with ASPX page layout, the page can be accessed directly
      via file share (this is how I do all of my layout).
   </p>
        <p style="TEXT-ALIGN: center">
          <img class="thumb" onclick="ShowFullSize(this)" src="http://www.charliedigital.com/content/binary/big-picture_t.png" border="0" />
        </p>
        <p>
      For more info on creating layout apps, check out the following articles on packaging
      SharePoint solutions:
   </p>
        <ul>
          <li>
         Ted Pattison <a href="http://blogs.technet.com/wbaer/archive/2007/03/29/building-solutions-for-microsoft-office-sharepoint-server-2007-windows-sharepoint-services-3-0.aspx">on
         MSDN</a>.</li>
          <li>
         An <a href="http://blogs.technet.com/wbaer/archive/2007/03/29/building-solutions-for-microsoft-office-sharepoint-server-2007-windows-sharepoint-services-3-0.aspx">excellent
         post</a> by Bill Baer.</li>
          <li>
         Evgeny Tugarev's <a href="http://geekswithblogs.net/evgenyblog/archive/2008/01/27/118966.aspx">excellent
         5 step guide</a>.</li>
        </ul>
        <img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=66d40551-2809-4fc6-bbfc-1d73d5c43779" />
      </body>
      <title>Nuking SharePoint Styles For Layout Page Applications</title>
      <guid>http://www.charliedigital.com/PermaLink,guid,66d40551-2809-4fc6-bbfc-1d73d5c43779.aspx</guid>
      <link>http://www.charliedigital.com/PermaLink,guid,66d40551-2809-4fc6-bbfc-1d73d5c43779.aspx</link>
      <pubDate>Thu, 24 Apr 2008 12:59:46 GMT</pubDate>
      <description>&lt;p&gt;
   SharePonit layout apps (as I call them) are the missing link in most developer's understanding
   of SharePoint and why it seems like it can be a pain in the butt as a development
   platform.&amp;nbsp; As &lt;a href="http://www.charliedigital.com/PermaLink,guid,d06bde93-9fa9-4381-af42-0ee9d1330d63.aspx"&gt;I've
   discussed previously&lt;/a&gt;, SharePoint development only deviates from regular ASP.NET
   development ever so slightly.&amp;nbsp; A bit of creativity and ingenuity easily overcomes
   most hurdles.
&lt;/p&gt;
&lt;p&gt;
   As I'm doing development in the area, I'd like to help shed some light on the mystery
   of it all and show how developers and SharePoint can work together in harmony :-)
&lt;/p&gt;
&lt;p&gt;
   One of the first steps to making happy with SharePoint when working with layout pages
   is to nuke the SharePoint CSS which creates weird padding around the main work area.&amp;nbsp;
   I'm sure it may have &lt;em&gt;some&lt;/em&gt; purpose, but it's irrelevant for us at the moment.
&lt;/p&gt;
&lt;p&gt;
   Let's take a look.
&lt;/p&gt;
&lt;p&gt;
   In the following screen, I've added a &amp;lt;div/&amp;gt; element with a one pixel, black
   border with width and height set to 100% (this is in IE7 and it looks about the same
   in FF2).
&lt;/p&gt;
&lt;p style="TEXT-ALIGN: center"&gt;
   &lt;img class=thumb onclick=ShowFullSize(this) src="http://www.charliedigital.com/content/binary/ugly-whitespace_t.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   Notice the fat white padding on the top and the right.&amp;nbsp; This is useless and ugly.&amp;nbsp;
   Not only that, we didn't acheive the 100% height that we'd like to.&amp;nbsp; We can nuke
   it with some CSS:
&lt;/p&gt;
&lt;div class=code&gt;&lt;pre&gt;&lt;font face="Lucida Console"&gt;&lt;font color=#555555&gt;/*--- override
   WSS styles ---*/&lt;/font&gt; &lt;font color=#e87400&gt;body { &lt;/font&gt;&lt;font color=#0000ff&gt;height: &lt;/font&gt;&lt;font color=#e87400&gt;100%;
   }&lt;/font&gt; &lt;font color=#e87400&gt;.ms-formareaframe { &lt;/font&gt;&lt;font color=#0000ff&gt;padding: &lt;/font&gt;&lt;font color=#e87400&gt;2px
   4px 4px 4px; &lt;/font&gt;&lt;font color=#0000ff&gt;background: &lt;/font&gt;&lt;font color=#e87400&gt;#fff; &lt;/font&gt;&lt;font color=#0000ff&gt;height:&lt;/font&gt;&lt;font color=#e87400&gt;100%;
   }&lt;/font&gt; &lt;font color=#e87400&gt;.ms-propertysheet { &lt;/font&gt;&lt;font color=#0000ff&gt;height: &lt;/font&gt;&lt;font color=#e87400&gt;100%;
   }&lt;/font&gt; &lt;font color=#e87400&gt;#onetidMainBodyPadding { &lt;/font&gt;&lt;font color=#0000ff&gt;height: &lt;/font&gt;&lt;font color=#e87400&gt;0px;
   }&lt;/font&gt; &lt;font color=#e87400&gt;#onetidMainBodyPadding img { &lt;/font&gt;&lt;font color=#0000ff&gt;height: &lt;/font&gt;&lt;font color=#e87400&gt;0px; &lt;/font&gt;&lt;font color=#0000ff&gt;display: &lt;/font&gt;&lt;font color=#ff0000&gt;none&lt;/font&gt;&lt;font color=#e87400&gt;;
   }&lt;/font&gt; &lt;font color=#e87400&gt;#onetidYPadding { &lt;/font&gt;&lt;font color=#0000ff&gt;width: &lt;/font&gt;&lt;font color=#e87400&gt;0px;
   }&lt;/font&gt; &lt;font color=#e87400&gt;#onetidYPadding img { &lt;/font&gt;&lt;font color=#0000ff&gt;width: &lt;/font&gt;&lt;font color=#e87400&gt;0px; &lt;/font&gt;&lt;font color=#0000ff&gt;display: &lt;/font&gt;&lt;font color=#ff0000&gt;none&lt;/font&gt;&lt;font color=#e87400&gt;;
   }&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
   And here's the result:
&lt;/p&gt;
&lt;p style="TEXT-ALIGN: center"&gt;
   &lt;img class=thumb onclick=ShowFullSize(this) src="http://www.charliedigital.com/content/binary/nuked-whitespace_t.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   Bingo!&amp;nbsp; It looks kind of the same in FF2 (FF2 overdraws the 100% declaration
   and cuts off the bottom and right borders; this does require some CSS&amp;nbsp;hackery
   to fix).
&lt;/p&gt;
&lt;p&gt;
   But the big picture is that now we have a blank slate with which to integrate with
   SharePoint.&amp;nbsp; You get all of the benefits of SharePoint authentication, document
   management, profiling, and so on just by putting your ASP.NET application into SharePoint
   as a layout page.&amp;nbsp; Development is easier than it would seem since the package,
   during development, only has to be deployed once.&amp;nbsp; Otherwise, all of the files
   can be deployed to SharePoint using an automated XCOPY or manually.&amp;nbsp; In some
   cases, for example working with ASPX page layout, the page can be accessed directly
   via file share (this is how I do all of my layout).
&lt;/p&gt;
&lt;p style="TEXT-ALIGN: center"&gt;
   &lt;img class=thumb onclick=ShowFullSize(this) src="http://www.charliedigital.com/content/binary/big-picture_t.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   For more info on creating layout apps, check out the following articles on packaging
   SharePoint solutions:
&lt;/p&gt;
&lt;ul&gt;
   &lt;li&gt;
      Ted Pattison &lt;a href="http://blogs.technet.com/wbaer/archive/2007/03/29/building-solutions-for-microsoft-office-sharepoint-server-2007-windows-sharepoint-services-3-0.aspx"&gt;on
      MSDN&lt;/a&gt;.&lt;/li&gt;
   &lt;li&gt;
      An &lt;a href="http://blogs.technet.com/wbaer/archive/2007/03/29/building-solutions-for-microsoft-office-sharepoint-server-2007-windows-sharepoint-services-3-0.aspx"&gt;excellent
      post&lt;/a&gt; by Bill Baer.&lt;/li&gt;
   &lt;li&gt;
      Evgeny Tugarev's &lt;a href="http://geekswithblogs.net/evgenyblog/archive/2008/01/27/118966.aspx"&gt;excellent
      5 step guide&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=66d40551-2809-4fc6-bbfc-1d73d5c43779" /&gt;</description>
      <comments>http://www.charliedigital.com/CommentView,guid,66d40551-2809-4fc6-bbfc-1d73d5c43779.aspx</comments>
      <category>SharePoint</category>
    </item>
    <item>
      <trackback:ping>http://www.charliedigital.com/Trackback.aspx?guid=ce5a0d97-a05c-4965-afa3-70b640521738</trackback:ping>
      <pingback:server>http://www.charliedigital.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.charliedigital.com/PermaLink,guid,ce5a0d97-a05c-4965-afa3-70b640521738.aspx</pingback:target>
      <dc:creator>cchen@charliedigital.com (Charles Chen)</dc:creator>
      <wfw:comment>http://www.charliedigital.com/CommentView,guid,ce5a0d97-a05c-4965-afa3-70b640521738.aspx</wfw:comment>
      <wfw:commentRss>http://www.charliedigital.com/SyndicationService.asmx/GetEntryCommentsRss?guid=ce5a0d97-a05c-4965-afa3-70b640521738</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      I'm not a metal fan, but I like <a href="http://www.roadrunnerrecords.com/blabbermouth.net/news.aspx?mode=Article&amp;newsitemID=95391">this
      one</a>.
   </p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <span>
              <span class="whiteMedium">"We Need To Let Metal And Odin Catch The Kids Before
      Jesus Does!" -- HELHEIM</span>
            </span>
          </p>
        </blockquote>
        <p dir="ltr">
          <span>
            <span class="whiteMedium">Funny.</span>
          </span>
        </p>
        <img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=ce5a0d97-a05c-4965-afa3-70b640521738" />
      </body>
      <title>Quote of the Day</title>
      <guid>http://www.charliedigital.com/PermaLink,guid,ce5a0d97-a05c-4965-afa3-70b640521738.aspx</guid>
      <link>http://www.charliedigital.com/PermaLink,guid,ce5a0d97-a05c-4965-afa3-70b640521738.aspx</link>
      <pubDate>Wed, 23 Apr 2008 03:43:04 GMT</pubDate>
      <description>&lt;p&gt;
   I'm not a metal fan, but I like &lt;a href="http://www.roadrunnerrecords.com/blabbermouth.net/news.aspx?mode=Article&amp;amp;newsitemID=95391"&gt;this
   one&lt;/a&gt;.
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   &lt;span&gt;&lt;span class=whiteMedium&gt;"We Need To Let Metal And Odin Catch The Kids Before
   Jesus Does!" -- HELHEIM&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p dir=ltr&gt;
   &lt;span&gt;&lt;span class=whiteMedium&gt;Funny.&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=ce5a0d97-a05c-4965-afa3-70b640521738" /&gt;</description>
      <comments>http://www.charliedigital.com/CommentView,guid,ce5a0d97-a05c-4965-afa3-70b640521738.aspx</comments>
      <category>QOTD</category>
    </item>
    <item>
      <trackback:ping>http://www.charliedigital.com/Trackback.aspx?guid=755f0ec5-07de-42b6-b46b-92de6a2b30ad</trackback:ping>
      <pingback:server>http://www.charliedigital.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.charliedigital.com/PermaLink,guid,755f0ec5-07de-42b6-b46b-92de6a2b30ad.aspx</pingback:target>
      <dc:creator>cchen@charliedigital.com (Charles Chen)</dc:creator>
      <wfw:comment>http://www.charliedigital.com/CommentView,guid,755f0ec5-07de-42b6-b46b-92de6a2b30ad.aspx</wfw:comment>
      <wfw:commentRss>http://www.charliedigital.com/SyndicationService.asmx/GetEntryCommentsRss?guid=755f0ec5-07de-42b6-b46b-92de6a2b30ad</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      High property taxes?  Check.  Terrible congestion?  Check.  Exit
      13?  Check (<em>for those not in the know, exit 13 on the NJ Turnpike is the
      location of an all encompassing foul odor from the refineries located in the area</em>). 
      Overabundance of guidos?  Check.
   </p>
        <p>
      For all the reasons that NJ sucks, there are a few bright spots like <a href="http://en.wikipedia.org/wiki/Grease_Trucks">the
      grease trucks at Rutgers</a> and <a href="http://arstechnica.com/news.ars/post/20080422-nj-court-blocks-ip-disclosure-without-a-grand-jury-subpoena.html">an
      interesting little ruling</a> by the NJ Supreme Court:
   </p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
      The justices say that IP addresses are sufficiently anonymous to justify privacy protection
      because, theoretically, only the Internet service provider can identify who is associated
      with a specific IP address.
   </p>
          <p>
      "Internet users today enjoy relatively complete IP address anonymity when surfing
      the Web. Given the current state of technology, the dynamic, temporarily assigned,
      numerical IP address cannot be matched to an individual user without the help of an
      ISP. Therefore, we accept as reasonable the expectation that one's identity will not
      be discovered through a string of numbers left behind on a website"
   </p>
        </blockquote>
        <img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=755f0ec5-07de-42b6-b46b-92de6a2b30ad" />
      </body>
      <title>New Jersey Gets *Something* Right</title>
      <guid>http://www.charliedigital.com/PermaLink,guid,755f0ec5-07de-42b6-b46b-92de6a2b30ad.aspx</guid>
      <link>http://www.charliedigital.com/PermaLink,guid,755f0ec5-07de-42b6-b46b-92de6a2b30ad.aspx</link>
      <pubDate>Tue, 22 Apr 2008 18:10:06 GMT</pubDate>
      <description>&lt;p&gt;
   High property taxes?&amp;nbsp; Check.&amp;nbsp; Terrible congestion?&amp;nbsp; Check.&amp;nbsp; Exit
   13?&amp;nbsp; Check (&lt;em&gt;for those not in the know, exit 13 on the NJ Turnpike is the
   location of an all encompassing foul odor from the refineries located in the area&lt;/em&gt;).&amp;nbsp;
   Overabundance of guidos?&amp;nbsp; Check.
&lt;/p&gt;
&lt;p&gt;
   For all the reasons that NJ sucks, there are a few bright spots like &lt;a href="http://en.wikipedia.org/wiki/Grease_Trucks"&gt;the
   grease trucks at Rutgers&lt;/a&gt; and &lt;a href="http://arstechnica.com/news.ars/post/20080422-nj-court-blocks-ip-disclosure-without-a-grand-jury-subpoena.html"&gt;an
   interesting little ruling&lt;/a&gt; by the NJ Supreme Court:
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
   The justices say that IP addresses are sufficiently anonymous to justify privacy protection
   because, theoretically, only the Internet service provider can identify who is associated
   with a specific IP address.
&lt;/p&gt;
&lt;p&gt;
   "Internet users today enjoy relatively complete IP address anonymity when surfing
   the Web. Given the current state of technology, the dynamic, temporarily assigned,
   numerical IP address cannot be matched to an individual user without the help of an
   ISP. Therefore, we accept as reasonable the expectation that one's identity will not
   be discovered through a string of numbers left behind on a website"
&lt;/p&gt;
&lt;/blockquote&gt;&lt;img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=755f0ec5-07de-42b6-b46b-92de6a2b30ad" /&gt;</description>
      <comments>http://www.charliedigital.com/CommentView,guid,755f0ec5-07de-42b6-b46b-92de6a2b30ad.aspx</comments>
      <category>News</category>
    </item>
    <item>
      <trackback:ping>http://www.charliedigital.com/Trackback.aspx?guid=16cb0e3f-fa1b-4bd1-b90a-bd0a48b5c5ff</trackback:ping>
      <pingback:server>http://www.charliedigital.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.charliedigital.com/PermaLink,guid,16cb0e3f-fa1b-4bd1-b90a-bd0a48b5c5ff.aspx</pingback:target>
      <dc:creator>cchen@charliedigital.com (Charles Chen)</dc:creator>
      <wfw:comment>http://www.charliedigital.com/CommentView,guid,16cb0e3f-fa1b-4bd1-b90a-bd0a48b5c5ff.aspx</wfw:comment>
      <wfw:commentRss>http://www.charliedigital.com/SyndicationService.asmx/GetEntryCommentsRss?guid=16cb0e3f-fa1b-4bd1-b90a-bd0a48b5c5ff</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
      As we're currently mulling a full transition to VS2008 and .NET 3.5, I've been investigating
      VSTO3 and ClickOnce once again.  My initial encounters with VSTO and ClickOnce
      were lacking.  With regards to VSTO, I didn't find anything that I could do with
      it that I couldn't do <em>without it.</em>  Indeed, it's more of an extension
      of the extensibility model which provides some under the cover plumbing than anything
      else.
   </p>
        <p>
      The decision to attach ourselves to VSTO3 and ClickOnce is no light matter. 
      Luckily, Cindy Meister (Office MVP) and Mary Lee (Microsoft) were kind enough
      to weigh in on the matter <a href="http://forums.microsoft.com/Forums/ShowPost.aspx?PostID=3213693&amp;SiteID=1&amp;mode=1">over
      at the MSDN forums</a>.
   </p>
        <p>
      I think all Office developers should head over and take a look as it contains a wealth
      of information (and clarifies some common misunderstandings) with regards to
      VSTO and ClickOnce.
   </p>
        <img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=16cb0e3f-fa1b-4bd1-b90a-bd0a48b5c5ff" />
      </body>
      <title>VSTO Versus Extensibility</title>
      <guid>http://www.charliedigital.com/PermaLink,guid,16cb0e3f-fa1b-4bd1-b90a-bd0a48b5c5ff.aspx</guid>
      <link>http://www.charliedigital.com/PermaLink,guid,16cb0e3f-fa1b-4bd1-b90a-bd0a48b5c5ff.aspx</link>
      <pubDate>Mon, 21 Apr 2008 15:57:14 GMT</pubDate>
      <description>&lt;p&gt;
   As we're currently mulling a full transition to VS2008 and .NET 3.5, I've been investigating
   VSTO3 and ClickOnce once again.&amp;nbsp; My initial encounters with VSTO and ClickOnce
   were lacking.&amp;nbsp; With regards to VSTO, I didn't find anything that I could do with
   it that I couldn't do &lt;em&gt;without it.&lt;/em&gt;&amp;nbsp; Indeed, it's more of an extension
   of the extensibility model which provides some under the cover plumbing than anything
   else.
&lt;/p&gt;
&lt;p&gt;
   The decision to attach ourselves to VSTO3 and ClickOnce is no light matter.&amp;nbsp;
   Luckily, Cindy Meister (Office MVP)&amp;nbsp;and Mary Lee (Microsoft)&amp;nbsp;were kind enough
   to weigh in on the matter &lt;a href="http://forums.microsoft.com/Forums/ShowPost.aspx?PostID=3213693&amp;amp;SiteID=1&amp;amp;mode=1"&gt;over
   at the MSDN forums&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
   I think all Office developers should head over and take a look as it contains a wealth
   of information (and clarifies some common misunderstandings)&amp;nbsp;with regards to
   VSTO and ClickOnce.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.charliedigital.com/aggbug.ashx?id=16cb0e3f-fa1b-4bd1-b90a-bd0a48b5c5ff" /&gt;</description>
      <comments>http://www.charliedigital.com/CommentView,guid,16cb0e3f-fa1b-4bd1-b90a-bd0a48b5c5ff.aspx</comments>
      <category>Office</category>
    </item>
  </channel>
</rss>