<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Marcelo's WebLog : XML</title><link>http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx</link><description>Tags: XML</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>XslCompiledTransform and large template elements</title><link>http://blogs.msdn.com/marcelolr/archive/2009/12/01/xslcompiledtransform-and-large-template-elements.aspx</link><pubDate>Tue, 01 Dec 2009 22:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9930499</guid><dc:creator>marcelolr</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9930499.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9930499</wfw:commentRss><description>&lt;P&gt;When loading / compiling an XSLT document into an &lt;A href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx"&gt;XslCompiledTransform&lt;/A&gt; instance, we've seen some customers hit an interesting gotcha.&lt;/P&gt;
&lt;P&gt;In this case, a particular stylesheet had grown over time, through a series of, erm, clipboard operations, to about a 300KB file with &lt;EM&gt;a single template&lt;/EM&gt;. Rather than factoring out common processing, we found it was repeated. While the functionality was correct, it took many minutes and a large amount of memory to compile. Why? Because a template translates (roughly) to a generated .NET method, which in this case turned out to be over 500KB in IL (normally a method will turn out to have less than 1KB). Clearly this is not a common case scenario, and the JIT was designed for a different point, but a mechanical translation can end up producing these kinds of problems.&lt;/P&gt;
&lt;P&gt;So, remember - factoring is good for you, your platform, and your future program maintainers! Which probably includes you as well :)&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9930499" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item><item><title>MSXML XHTML DTDs - making the web better</title><link>http://blogs.msdn.com/marcelolr/archive/2009/11/30/msxml-xhtml-dtds-making-the-web-better.aspx</link><pubDate>Mon, 30 Nov 2009 22:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9928868</guid><dc:creator>marcelolr</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9928868.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9928868</wfw:commentRss><description>&lt;P&gt;The fix to requests for XHTML DTD files from the W3C Web server has been recently released. Windows Update should offer the fix automatically, but you can download and install the fix manually from the following links for various MSXML versions:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://support.microsoft.com/?kbid=973688"&gt;http://support.microsoft.com/?kbid=973688&lt;/A&gt; [MSXML4 SP2... if you haven't tried SP3 yet see below]&lt;BR&gt;&lt;A href="http://support.microsoft.com/?kbid=973685"&gt;http://support.microsoft.com/?kbid=973685&lt;/A&gt; [&lt;A href="http://blogs.msdn.com/xmlteam/archive/2009/03/06/msxml4-sp3-is-available-now.aspx" mce_href="http://blogs.msdn.com/xmlteam/archive/2009/03/06/msxml4-sp3-is-available-now.aspx"&gt;MSXML4 SP3&lt;/A&gt;]&lt;BR&gt;&lt;A href="http://support.microsoft.com/?kbid=973686"&gt;http://support.microsoft.com/?kbid=973686&lt;/A&gt; [MSXML6 Out-Of-Band, for XP SP2 and Win2K3]&lt;BR&gt;&lt;A href="http://support.microsoft.com/?kbid=973687"&gt;http://support.microsoft.com/?kbid=973687&lt;/A&gt; [MSXML3 and MSXML6 for all OSes where these components are in-band]&lt;/P&gt;
&lt;P&gt;What exactly is this about? Well, there are a number of cases where this can happen, but one common scenario that we've seen people run into when writing AJAX web pages is to request a page of information from the server, load it into an XML document and extract some information or merge it into the existing page.&lt;/P&gt;
&lt;P&gt;The problem with this approach is that when you load the document into an MSXML document "by hand" (ie, not through &lt;A href="http://msdn.microsoft.com/en-us/library/ms534370.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms534370.aspx"&gt;responseXML&lt;/A&gt; on the XHR object), DTD processing is enabled, and the DOCTYPE declaration directs MSXML to go look up the XHTML DTD so you can use entities like &amp;amp;nbsp;.&lt;/P&gt;
&lt;P&gt;Multiply this by each web browser accessing a popular site, and you can imagine why no-one is happy with this situation: web sites break when the resource is not available, the W3C servers get overloaded, and users of web sites lose functionality with odd scripting errors.&lt;/P&gt;
&lt;P&gt;The fix caches the XHTML DTDs in MSXML - these resources haven't changed for years and will likely end up in different URLs if something new comes along. So now clients save at least one round-trip (possibly more) and always get the DTD support they need.&lt;/P&gt;
&lt;P&gt;Try running this bit of script in a .js file to see the awesomeness in action.&lt;/P&gt;
&lt;P style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;function pullXHtml() {&lt;BR&gt;&amp;nbsp; var xml = new ActiveXObject("Msxml2.DOMDocument.3.0");&lt;BR&gt;&amp;nbsp; xml.async = false;&lt;BR&gt;&amp;nbsp; xml.loadXML(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&amp;gt;" +&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;simple document&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;" +&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;body&amp;gt;&amp;lt;p&amp;gt;a simple&amp;amp;nbsp;paragraph&amp;lt;/p&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;");&lt;BR&gt;&amp;nbsp; if (xml.parseError.errorCode != 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var myErr = xml.parseError;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WScript.Echo("You have error " + myErr.reason);&lt;BR&gt;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WScript.echo("Yay!");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WScript.echo(xml.xml);&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;pullXHtml();&lt;/P&gt;
&lt;P&gt;If you don't have the update, you might get an error such as the following.&lt;/P&gt;
&lt;P style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;You have error The server did not understand the request, or the request was invalid.&lt;BR&gt;Error processing resource 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'.&lt;/P&gt;
&lt;P&gt;If you do have the update, you'll see the parsed XML. Run this with &lt;A href="http://www.fiddler2.com/fiddler2/" mce_href="http://www.fiddler2.com/fiddler2/"&gt;Fiddler&lt;/A&gt; open and you'll&amp;nbsp;"see" the absence of network activity.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;BR&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9928868" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.msdn.com/marcelolr/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item><item><title>MSXML4 SP3, now with a CAB</title><link>http://blogs.msdn.com/marcelolr/archive/2009/10/01/msxml4-sp3-now-with-a-cab.aspx</link><pubDate>Fri, 02 Oct 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9901970</guid><dc:creator>marcelolr</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9901970.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9901970</wfw:commentRss><description>&lt;P&gt;Yep,&amp;nbsp;the redistributable CAB for MSXML4 SP3 is now available for download. Now you can deploy the latest / greatest version MSXML4 along with your app.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.microsoft.com/DOWNLOADS/details.aspx?familyid=7F6C0CB4-7A5E-4790-A7CF-9E139E6819C0&amp;amp;displaylang=en"&gt;http://www.microsoft.com/DOWNLOADS/details.aspx?familyid=7F6C0CB4-7A5E-4790-A7CF-9E139E6819C0&amp;amp;displaylang=en&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Remember, of course, that MSXML4 has been superseded by MSXML6, so you're better off upgrading; but if you can't because for example you don't own the component that has the dependency, the latest service pack contains the latest fixes.&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9901970" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item><item><title>Problems when installing SQL Server 2005 on an upgraded Windows XP SP3 with MSXML6 SP2</title><link>http://blogs.msdn.com/marcelolr/archive/2009/08/31/problems-when-installing-sql-server-2005-on-an-upgraded-windows-xp-sp3-with-msxml6-sp2.aspx</link><pubDate>Tue, 01 Sep 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9888843</guid><dc:creator>marcelolr</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9888843.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9888843</wfw:commentRss><description>&lt;P&gt;As mentioned in the &lt;A href="http://blogs.msdn.com/sqlblog/archive/2009/08/28/sql-server-2005-setup-fails-when-msxml-core-services-6-0-service-pack-2-has-already-been-installed.aspx" mce_href="http://blogs.msdn.com/sqlblog/archive/2009/08/28/sql-server-2005-setup-fails-when-msxml-core-services-6-0-service-pack-2-has-already-been-installed.aspx"&gt;SQL Server Support Blog&lt;/A&gt;, you may find an issue installing SQL Server 2005 if you install MSXML Core Services 6.0 Service Pack 2 on Windows XP SP2, then upgrade to Windows XP SP3, then try the SQL install.&lt;/P&gt;
&lt;P&gt;Check out that post for more details, along with the &lt;A href="http://support.microsoft.com/kb/968749" mce_href="http://support.microsoft.com/kb/968749"&gt;KB for the problem&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9888843" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/SQL/default.aspx">SQL</category><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item><item><title>XSLT Timer Released on Code Gallery</title><link>http://blogs.msdn.com/marcelolr/archive/2009/06/16/xslt-timer-released-on-code-gallery.aspx</link><pubDate>Wed, 17 Jun 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9751338</guid><dc:creator>marcelolr</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9751338.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9751338</wfw:commentRss><description>&lt;P&gt;Over this past weekend, the &lt;A href="http://code.msdn.microsoft.com/xslttimer" mce_href="http://code.msdn.microsoft.com/xslttimer"&gt;XSLT Timer tool&lt;/A&gt; has been released on Code Gallery.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=xslttimer&amp;amp;DownloadId=6174"&gt;&lt;IMG style="WIDTH: 560px; HEIGHT: 336px" src="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=xslttimer&amp;amp;DownloadId=6174" width=560 height=336 mce_src="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=xslttimer&amp;amp;DownloadId=6174"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This is a very simple tool, that will simply allow you to type / paste in a document and an XSLT stylesheet, and then tell you how long it takes on average to do the transform using the &lt;A href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx"&gt;XslCompiledTransform&lt;/A&gt; class. Very simple, but handy when trying ad hoc variations on ideas and such.&lt;/P&gt;
&lt;P&gt;You might want to look at the &lt;A href="http://blogs.msdn.com/marcelolr/pages/xslt-resources.aspx" mce_href="http://blogs.msdn.com/marcelolr/pages/xslt-resources.aspx"&gt;XML Resources page&lt;/A&gt; for links to other tools as well.&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;
&lt;P&gt;update #1 - adding an actual link to the tool helps :)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9751338" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item><item><title>XmlLite says: error C2146: syntax error : missing ';' before identifier 'IXmlReader'</title><link>http://blogs.msdn.com/marcelolr/archive/2009/06/05/xmllite-says-error-c2146-syntax-error-missing-before-identifier-ixmlreader.aspx</link><pubDate>Sat, 06 Jun 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9688013</guid><dc:creator>marcelolr</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9688013.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9688013</wfw:commentRss><description>&lt;P&gt;This is something that I've been asked more than once, and so here goes an answer that might help if you run into this.&lt;/P&gt;
&lt;P&gt;Let's say that you create a new project and borrow code or do something of the sort, and suddenly start getting an error message such as this one&lt;/P&gt;
&lt;P&gt;xmllite.h(49) : error C2146: syntax error : missing ';' before identifier 'IXmlReader'&lt;/P&gt;
&lt;P&gt;This typically points to a missing macro. You can fix this by adding this to your include headers:&lt;/P&gt;
&lt;P&gt;#include "objbase.h"&lt;/P&gt;
&lt;P&gt;If you're using Visual C++-style projects, this may already be included via stdafx.h including the Windows headers for you.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9688013" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/marcelolr/archive/tags/Windows/default.aspx">Windows</category></item><item><title>More group slicing in XSLT</title><link>http://blogs.msdn.com/marcelolr/archive/2009/06/04/more-group-slicing-in-xslt.aspx</link><pubDate>Fri, 05 Jun 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9683550</guid><dc:creator>marcelolr</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9683550.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9683550</wfw:commentRss><description>&lt;P&gt;To continue on my &lt;A href="http://blogs.msdn.com/marcelolr/archive/2009/06/02/simple-group-slicing-in-xslt.aspx" mce_href="http://blogs.msdn.com/marcelolr/archive/2009/06/02/simple-group-slicing-in-xslt.aspx"&gt;previous example&lt;/A&gt; on slicing (I made the term up, by the way), today we'll do something a little different.&lt;/P&gt;
&lt;P&gt;Let's say that instead of just inserting the slice elements and a few items, we want to copy the whole tree &lt;EM&gt;n&lt;/EM&gt; times (where &lt;EM&gt;n&lt;/EM&gt; is the number of slices), each time with a different slice of items. That includes elements beyond the things we're currently slicing.&lt;/P&gt;
&lt;P&gt;So let's say we have this document, similar to the previous one.&lt;/P&gt;
&lt;P style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;&amp;lt;group groupattribute='1'&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;repeat-me&amp;gt;each time&amp;lt;/repeat-me&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;item item='1'&amp;gt;1 &amp;lt;sub&amp;gt;text&amp;lt;/sub&amp;gt; &amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;item item='2'&amp;gt;2 &amp;lt;sub&amp;gt;text&amp;lt;/sub&amp;gt; &amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;item item='3'&amp;gt;3 &amp;lt;sub&amp;gt;text&amp;lt;/sub&amp;gt; &amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;item item='4'&amp;gt;4 &amp;lt;sub&amp;gt;text&amp;lt;/sub&amp;gt; &amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;item item='5'&amp;gt;5 &amp;lt;sub&amp;gt;text&amp;lt;/sub&amp;gt; &amp;lt;/item&amp;gt;&lt;BR&gt;&amp;lt;/group&amp;gt;&lt;/P&gt;
&lt;P&gt;And we want to get this effect.&lt;/P&gt;
&lt;P style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;&amp;lt;root&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;group groupattribute="1"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;repeat-me&amp;gt;each time&amp;lt;/repeat-me&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;item item="1"&amp;gt;1 &amp;lt;sub&amp;gt;text&amp;lt;/sub&amp;gt;&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;item item="2"&amp;gt;2 &amp;lt;sub&amp;gt;text&amp;lt;/sub&amp;gt;&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/group&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;group groupattribute="1"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;repeat-me&amp;gt;each time&amp;lt;/repeat-me&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;item item="3"&amp;gt;3 &amp;lt;sub&amp;gt;text&amp;lt;/sub&amp;gt;&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;item item="4"&amp;gt;4 &amp;lt;sub&amp;gt;text&amp;lt;/sub&amp;gt;&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/group&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;group groupattribute="1"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;repeat-me&amp;gt;each time&amp;lt;/repeat-me&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;item item="5"&amp;gt;5 &amp;lt;sub&amp;gt;text&amp;lt;/sub&amp;gt;&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/group&amp;gt;&lt;BR&gt;&amp;lt;/root&amp;gt;&lt;/P&gt;
&lt;P&gt;Here is a stylesheet that can accomplish this, using parameters to pass around the replacements nodes for each copy of the tree. As always, variations in the comments are welcome.&lt;/P&gt;
&lt;P style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;&amp;lt;xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;xsl:output method='xml' indent='yes'/&amp;gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;lt;!-- Just copy everything. --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;xsl:template match='@* | node()' mode='everything'&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;xsl:copy&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:apply-templates select='@* | node()' mode='everything'/&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/xsl:copy&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;/xsl:template&amp;gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;lt;!-- Copy everything but replace items with the replacement parameter. --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;xsl:template match='@* | node()' mode='withreplacement'&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;xsl:param name='replacement' /&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;xsl:copy&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Copy everything except item elements. --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:apply-templates select='@* | node()[local-name() != "item"]' mode='withreplacement'&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param name='replacement' select='$replacement' /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:apply-templates&amp;gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- If this is where items are, apply the replacement node-set. --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:if test='item'&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:apply-templates select='$replacement' mode='everything' /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:if&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/xsl:copy&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;/xsl:template&amp;gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;lt;!--&lt;BR&gt;&amp;nbsp;We matched the first of a slice of items.&lt;BR&gt;&amp;nbsp;Copy everything from the root, passing the current item&lt;BR&gt;&amp;nbsp;and its sibling(s) as the replacement.&lt;BR&gt;&amp;nbsp;--&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;xsl:template match='item' mode='firstofslice'&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;xsl:apply-templates select='/group' mode='withreplacement'&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:with-param &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; name='replacement' &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select='. | following-sibling::item[1]'&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/xsl:apply-templates&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;/xsl:template&amp;gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;lt;!-- Match to root, and put everything under a single element. --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;xsl:template match='/'&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;root&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Grab every second item to create a new group. --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:apply-templates select='group/item[position() mod 2 = 1]' mode='firstofslice' /&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/root&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;/xsl:template&amp;gt;&lt;BR&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9683550" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item><item><title>LINQ to XSD on CodePlex</title><link>http://blogs.msdn.com/marcelolr/archive/2009/06/03/linq-to-xsd-on-codeplex.aspx</link><pubDate>Thu, 04 Jun 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9692013</guid><dc:creator>marcelolr</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9692013.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9692013</wfw:commentRss><description>&lt;P&gt;I'm very, very pleased about today's &lt;A href="http://linqtoxsd.codeplex.com/" mce_href="http://linqtoxsd.codeplex.com/"&gt;announcement&lt;/A&gt; on LINQ to XSD being available on &lt;A href="http://linqtoxsd.codeplex.com/" mce_href="http://linqtoxsd.codeplex.com/"&gt;CodePlex&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;The functionality available should be esentially the same as what was released in the last Alpha Preview, so if you were already using this, it should be a smooth transition.&lt;/P&gt;
&lt;P&gt;The community of developers interested in LINQ to XSD will now be able to include this in their applications, as it's being released under the &lt;A href="http://linqtoxsd.codeplex.com/license" mce_href="http://linqtoxsd.codeplex.com/license"&gt;Ms-PL license&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9692013" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item><item><title>Simple group slicing in XSLT</title><link>http://blogs.msdn.com/marcelolr/archive/2009/06/02/simple-group-slicing-in-xslt.aspx</link><pubDate>Wed, 03 Jun 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9646206</guid><dc:creator>marcelolr</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9646206.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9646206</wfw:commentRss><description>&lt;P&gt;First, let me start with a disclaimer: I'm not an XSLT guru. I know folks that can truly do amazing things with it. Every now and then, though, I can help someone, and I thought I'd share a solution I came up with recently. I'll be happy to see alternate solutions posted in the comments.&lt;/P&gt;
&lt;P&gt;So, let's say you have an XML document such as this one:&lt;/P&gt;
&lt;P style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;&amp;lt;group&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;item&amp;gt;1&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;item&amp;gt;2&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;item&amp;gt;3&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;item&amp;gt;4&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;item&amp;gt;5&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;lt;/group&amp;gt;&lt;/P&gt;
&lt;P&gt;You'd like to create "slices" of the items in the group, such that you get them reparented in twos (could be three, four or whatever - we'll go with two items per slice). Any remainder try to fill up as much as possible of the last slice, so the transformed document should look like this.&lt;/P&gt;
&lt;P style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;&amp;lt;group&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;slice&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;item&amp;gt;1&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;item&amp;gt;2&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/slice&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;slice&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;item&amp;gt;3&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;item&amp;gt;4&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/slice&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;slice&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;item&amp;gt;5&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/slice&amp;gt;&lt;BR&gt;&amp;lt;/group&amp;gt;&lt;/P&gt;
&lt;P&gt;My solution has three templates: one for processing each item (I do some simple content copying "by hand"), one to process each slice (which has a the current context the first item in the slice), and one to process the whole document. The trick is to use the &lt;EM&gt;mod&lt;/EM&gt; function to pick the beginning item of each slice, and to use the &lt;EM&gt;following-sibling&lt;/EM&gt; axis to grab the ones that come right after.&lt;/P&gt;
&lt;P&gt;Here's the XSLT for the solution that produces the desired result.&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;
&lt;P&gt;&amp;lt;xsl:stylesheet&lt;BR&gt;&amp;nbsp;version='1.0'&lt;BR&gt;&amp;nbsp;xmlns:xsl='http://www.w3.org/1999/XSL/Transform'&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;xsl:output method='xml' indent='yes'/&amp;gt;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;lt;!-- Template for a single item in a slice. --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;xsl:template match='item' mode='inslice'&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;item&amp;gt;&amp;lt;xsl:value-of select='text()' /&amp;gt;&amp;lt;/item&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;/xsl:template&amp;gt; &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;lt;!-- Template for each slice. --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;xsl:template match='item' mode='firstofslice'&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;slice&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:apply-templates select='.' mode='inslice' /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:apply-templates select='following-sibling::item[1]' mode='inslice' /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;BR&gt;&amp;nbsp;&amp;nbsp; "grow" the slice by adding more of these, but change the 'mod' below:&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:apply-templates select='following-sibling::item[2]' mode='inslice' /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/slice&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;/xsl:template&amp;gt; &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;lt;xsl:template match='/'&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;group&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Grab every second item to create a slice. --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:apply-templates select='group/item[position() mod 2 = 1]' mode='firstofslice' /&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/group&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;/xsl:template&amp;gt; &lt;BR&gt;&lt;BR&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9646206" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item><item><title>XSLT Resources Posted</title><link>http://blogs.msdn.com/marcelolr/archive/2009/05/28/xslt-resources-posted.aspx</link><pubDate>Fri, 29 May 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9645159</guid><dc:creator>marcelolr</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9645159.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9645159</wfw:commentRss><description>I've posted a page on &lt;A href="http://blogs.msdn.com/marcelolr/pages/xslt-resources.aspx" mce_href="http://blogs.msdn.com/marcelolr/pages/xslt-resources.aspx"&gt;XSLT Resources&lt;/A&gt; that I hope to add to over time - stay tuned.&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9645159" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item><item><title>OpenXML and XML Literals - great video</title><link>http://blogs.msdn.com/marcelolr/archive/2009/04/21/openxml-and-xml-literals-great-video.aspx</link><pubDate>Wed, 22 Apr 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9559968</guid><dc:creator>marcelolr</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9559968.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9559968</wfw:commentRss><description>&lt;P&gt;Beth Massi shows off how you can use XML literals in VB.NET to do some very, very powerful stuff in a very, very straightforward way.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.dnrtv.com/default.aspx?showNum=138"&gt;http://www.dnrtv.com/default.aspx?showNum=138&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9559968" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item><item><title>DTD resolution and network behavior</title><link>http://blogs.msdn.com/marcelolr/archive/2009/04/20/dtd-resolution-and-network-behavior.aspx</link><pubDate>Tue, 21 Apr 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9555509</guid><dc:creator>marcelolr</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9555509.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9555509</wfw:commentRss><description>&lt;P&gt;Following up from my &lt;A href="http://blogs.msdn.com/marcelolr/archive/2009/04/17/faster-xml-don-t-resolve-dtds-if-you-don-t-need-to.aspx" mce_href="http://blogs.msdn.com/marcelolr/archive/2009/04/17/faster-xml-don-t-resolve-dtds-if-you-don-t-need-to.aspx"&gt;last post&lt;/A&gt;, &lt;A href="http://blogs.msdn.com/user/Profile.aspx?UserID=106840" mce_href="http://blogs.msdn.com/user/Profile.aspx?UserID=106840"&gt;danieldsmith&lt;/A&gt; asked about a couple of additional details. I &lt;EM&gt;think&lt;/EM&gt; I responded in the comments, but because (a) it's generally useful, and (b) I had some problems with my network connection (because I monkeying around with it), the reply may have been lost. So here we go again.&lt;/P&gt;
&lt;P&gt;First, is caching implemented for the resolved DTDs? No, the default resolver doesn't do any caching&amp;nbsp;- files will always be requested. So if you're loading documents with DTDs in a tight loop, you might get a pretty significant perf improvement here.&lt;/P&gt;
&lt;P&gt;Second, what happens if there is no network connectivity? Well, the framework can't do validation without the DTD, and even if it could it would be unable to expand entities, so as you might guess, the problem isn't silently ignored - you'll get an exception instead.&lt;/P&gt;
&lt;P&gt;Trying this on my machine at home, I got two slightly different exception - your mileage may vary. The first time I had Fiddler running, and I got a &lt;A href="http://msdn.microsoft.com/en-us/library/system.net.webexception.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.net.webexception.aspx"&gt;System.Net.WebException&lt;/A&gt; with a Message value "The remote server returned an error: (502) Bad Gateway.", and a Status value of &lt;A href="http://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus.aspx"&gt;ProtocolError&lt;/A&gt;. There was a Response assigned to it, which had a message of its own, "Fiddler - DNS Lookup Failed".&lt;/P&gt;
&lt;P&gt;Then I shut down Fiddler and got another WebException, although this time the message was "The remote name could not be resolved: 'www.w3.org'", and the Response of the exception was null.&lt;/P&gt;
&lt;P&gt;So now you know. Keep an eye on your network activity, and turn off features that you don't use to get perf / stability improvements without having to go and make changes to your application.&lt;/P&gt;
&lt;P&gt;As a side note, I like to run &lt;A href="http://www.fiddler2.com/Fiddler2/" mce_href="http://www.fiddler2.com/Fiddler2/"&gt;Fiddler&lt;/A&gt; every now and then, just to see what kind of web traffic my machine is generating - it's awfully interesting to see the kinds of things that are going on sometimes.&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9555509" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item><item><title>Faster XML - don't resolve DTDs if you don't need to</title><link>http://blogs.msdn.com/marcelolr/archive/2009/04/17/faster-xml-don-t-resolve-dtds-if-you-don-t-need-to.aspx</link><pubDate>Sat, 18 Apr 2009 01:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554665</guid><dc:creator>marcelolr</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9554665.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9554665</wfw:commentRss><description>&lt;P&gt;When loading an XML document through &lt;A href="http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.load.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.load.aspx"&gt;XmlDocument.Load&lt;/A&gt; or &lt;A href="http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.load.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.load.aspx"&gt;XDocument.Load&lt;/A&gt;, the default behavior when finding a DTD reference is to go resolve the URL, which typically means one or more web requests. Often, however, the DTD is there more as a marker of what the document contains than anything else, and you might not want to reference entities or do validation.&lt;/P&gt;
&lt;P&gt;For example, let's say I have the following code. This will load an XML document from a string, then write it out to the console.&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;const&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; xmlText = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;&lt;BR&gt;@"&amp;lt;!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'&amp;gt;&lt;BR&gt;&amp;lt;html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'&amp;gt;&lt;BR&gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Hello&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;BR&gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Hello from XHTML&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&lt;BR&gt;&amp;lt;/html&amp;gt;"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;&lt;BR&gt;XmlDocument&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; doc = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlDocument&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;();&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;doc.LoadXml(xmlText);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Console&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.WriteLine(doc.InnerXml);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Console&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.ReadKey();&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;The problem here is that there is no reason for us to access the DTD for this particular application, and yet the following requests will go out.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&lt;/A&gt;&lt;BR&gt;&lt;A href="http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent"&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent&lt;/A&gt;&lt;BR&gt;&lt;A href="http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent"&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent&lt;/A&gt;&lt;BR&gt;&lt;A href="http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent"&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The first solution, available on Silverlight, is to use the &lt;A href="http://msdn.microsoft.com/en-us/library/system.xml.resolvers.xmlpreloadedresolver(VS.95).aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.resolvers.xmlpreloadedresolver(VS.95).aspx"&gt;XmlPreloadedResolver&lt;/A&gt;. By default it will contain DTDs for XHTML and RSS, but you can add your own. In this case, you get the same level of functionality as if the real resources had been requests. For example, you can use entity references such as &lt;EM&gt;&amp;amp;nbsp;&lt;/EM&gt; to mean "non-breaking white space". If you assign an instance as your &lt;A href="http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.xmlresolver.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.xmlresolver.aspx"&gt;XmlResolver&lt;/A&gt;, you're good to go.&lt;/P&gt;
&lt;P&gt;A second solution, which is also available on the full .NET Framework, is to simply set the XmlResolver property to &lt;EM&gt;null&lt;/EM&gt;. In this case, no requests will be made at all, but you won't be able to use entity references nor have the document validated.&lt;/P&gt;
&lt;P&gt;Note that this isn't just available on XmlDocument, but also through &lt;A href="http://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.aspx"&gt;XmlReaderSettings&lt;/A&gt;, anytime you're creating an XmlReader (which can of course be used with both XmlDocument and&amp;nbsp;XDocument, along with many other parts of the framework).&lt;/P&gt;
&lt;P&gt;In the next release of the .NET Framework, there will be a few other ways in which you may save the resource requests, but these options are available to you today.&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9554665" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item><item><title>XmlSchema and XmlSchemaSet thread safety</title><link>http://blogs.msdn.com/marcelolr/archive/2009/03/16/xmlschema-and-xmlschemaset-thread-safety.aspx</link><pubDate>Tue, 17 Mar 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9472742</guid><dc:creator>marcelolr</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9472742.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9472742</wfw:commentRss><description>&lt;P&gt;Here's a good word of warning: even if an object "feels" read-only because you're not calling code to modify it, if it's not documented as safe for use from multiple threads, then you shouldn't risk it.&lt;/P&gt;
&lt;P&gt;In particular, I'd like to talk about &lt;A class="" href="http://msdn.microsoft.com/en-us/library/system.xml.schema.xmlschema.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.schema.xmlschema.aspx"&gt;XmlSchema&lt;/A&gt; and &lt;A class="" href="http://msdn.microsoft.com/en-us/library/system.xml.schema.xmlschemaset.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.xml.schema.xmlschemaset.aspx"&gt;XmlSchemaSet&lt;/A&gt; today. Building these has a cost associated, and so it's nice to be able to build them once and then reuse them. But you have to be very careful in doing this. The docs say that all instance methods are not safe for multiple thread usage, but you don't really use them directly during validation, so it's hard to tell from the outside what's safe and what's not.&lt;/P&gt;
&lt;P&gt;In a nutshell, the only thing you can do that is safe for concurrent usage is to use a validating reader. Here's the sample code to try this out (for some reason, this "breaks" more on 64-bit machines, but it's unsafe on all architectures).&lt;/P&gt;
&lt;P&gt;First, a little helper to create an XmlSchema.&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;private&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlSchema&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; CreateSchema()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; schemaText = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;@"&amp;lt;?xml version='1.0'?&amp;gt;&lt;BR&gt;&amp;lt;xs:schema id='play' targetNamespace='http://tempuri.org/play.xsd'&lt;BR&gt;&amp;nbsp;elementFormDefault='qualified' xmlns='http://tempuri.org/play.xsd'&lt;BR&gt;&amp;nbsp;xmlns:xs='http://www.w3.org/2001/XMLSchema'&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;xs:element name='myShoeSize'&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;xs:complexType&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;xs:simpleContent&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:extension base='xs:decimal'&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xs:attribute name='sizing' type='xs:string' /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xs:extension&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/xs:simpleContent&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/xs:complexType&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/xs:element&amp;gt;&lt;BR&gt;&amp;lt;/xs:schema&amp;gt;"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;StringReader&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; reader = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;StringReader&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;(schemaText))&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlSchema&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.Read(reader, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;null&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;Next, a simple XmlSchemaSet.&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;private&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlSchemaSet&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; CreateSchemaSet(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlSchema&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; schema)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlSchemaSet&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; set = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlSchemaSet&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;();&lt;BR&gt;&amp;nbsp; set.Add(schema);&lt;BR&gt;&amp;nbsp; set.Compile();&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; set;&lt;BR&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;Finally, some validation:&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;private&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; ValidateDocument(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlSchemaSet&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; set)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; doc = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;@"&amp;lt;myShoeSize xmlns='http://tempuri.org/play.xsd' sizing='123' /&amp;gt;"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlReaderSettings&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; settings = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlReaderSettings&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;();&lt;BR&gt;&amp;nbsp; settings.Schemas = set;&lt;BR&gt;&amp;nbsp; settings.ValidationEventHandler += &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;ValidationEventHandler&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;(settings_ValidationEventHandler);&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;StringReader&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; reader = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;StringReader&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;(doc))&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlReader&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; x = &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlReader&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.Create(reader, settings))&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;while&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (x.Read()) { }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;BR&gt;private&lt;FONT color=#000000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt; failCount;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;void&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; settings_ValidationEventHandler(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;object&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; sender, &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;ValidationEventArgs&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; System.Threading.&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Interlocked&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.Increment(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;ref&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; failCount);&lt;BR&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/FONT&gt;Now, armed with these, I will show you some code that &lt;EM&gt;is&lt;/EM&gt; thread-safe, but that a single line reorder would cause to break.&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlSchema&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; schema = CreateSchema();&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Thread&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;[] threads = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Thread&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;[10];&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlSchemaSet&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; set = CreateSchemaSet(schema);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;for&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; i = 0; i &amp;lt; threads.Length; i++)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; threads[i] = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Thread&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;((x) =&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;for&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; j = 0; j &amp;lt; 1000; j++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;// If the CreateSchemaSet were here&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;// instead of outside this would break!&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;//&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;// Don't add the schema to the &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;// XmlSchemaSet from multiple threads!&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;//&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;// XmlSchemaSet set = CreateSchemaSet(schema);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;//&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;ValidateDocument(set);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Array&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.ForEach(threads, (t) =&amp;gt; t.Start());&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Array&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.ForEach(threads, (t) =&amp;gt; t.Join());&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.Text = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"Failure count: "&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; + failCount;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;The part before the thread creation is all thread-safe; the stuff inside the callback&amp;nbsp;is happening on multiple threads at the same time. You can only use the set for validation here!&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9472742" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item><item><title>Fast way to convert XmlDocument into XDocument</title><link>http://blogs.msdn.com/marcelolr/archive/2009/03/13/fast-way-to-convert-xmldocument-into-xdocument.aspx</link><pubDate>Sat, 14 Mar 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9471290</guid><dc:creator>marcelolr</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/marcelolr/comments/9471290.aspx</comments><wfw:commentRss>http://blogs.msdn.com/marcelolr/commentrss.aspx?PostID=9471290</wfw:commentRss><description>&lt;P&gt;This question came up in &lt;A class="" href="http://social.msdn.microsoft.com/Forums/en-US/xmlandnetfx/threads/" mce_href="http://social.msdn.microsoft.com/Forums/en-US/xmlandnetfx/threads/"&gt;the forums&lt;/A&gt; a little while ago, and I thought it might be interesting to do some comparisons.&lt;/P&gt;
&lt;P&gt;I first came up with a few ways of turning an XmlDocument into an XDocument.&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;private&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;static&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XDocument&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; DocumentToXDocument(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlDocument&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; doc)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XDocument&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.Parse(doc.OuterXml);&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;private&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;static&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XDocument&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; DocumentToXDocumentNavigator(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlDocument&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; doc)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XDocument&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.Load(doc.CreateNavigator().ReadSubtree());&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;private&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;static&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XDocument&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; DocumentToXDocumentReader(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlDocument&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; doc)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XDocument&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.Load(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlNodeReader&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;(doc));&lt;BR&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;Next I whipped up a function to time these with something quick and dirty. I make sure the past activity doesn't both much in terms of leaving garbage, and I warm up the action a bit (I also warm up the Stopwatch methods, just in case).&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;private&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;static&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;long&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; Time(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; count, &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Action&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; action)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;GC&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.Collect();&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;for&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; i = 0; i &amp;lt; 3; i++)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; action();&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Stopwatch&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; watch = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;Stopwatch&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;();&lt;BR&gt;&amp;nbsp; watch.Start();&lt;BR&gt;&amp;nbsp; watch.Stop();&lt;BR&gt;&amp;nbsp; watch.Reset();&lt;BR&gt;&amp;nbsp; watch.Start();&lt;BR&gt;&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;for&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; i = 0; i &amp;lt; count; i++)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; action();&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;long&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; result = watch.ElapsedMilliseconds;&lt;BR&gt;&amp;nbsp; watch.Stop();&lt;BR&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; result;&lt;BR&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;And finally, all together:&lt;/P&gt;
&lt;DIV style="FONT-FAMILY: Consolas, Lucida Console, Courier New"&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;
&lt;P&gt;StringBuilder&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; sb = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;StringBuilder&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;();&lt;BR&gt;sb.Append(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"&amp;lt;parent&amp;gt;"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;for&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; i = 0; i &amp;lt; 1000; i++)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; sb.Append(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;" &amp;lt;child&amp;gt;text&amp;lt;/child&amp;gt;"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;}&lt;BR&gt;sb.Append(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;&lt;FONT color=#a31515 size=2&gt;"&amp;lt;/parent&amp;gt;"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; text = sb.ToString();&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlDocument&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; doc = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;FONT color=#2b91af size=2&gt;XmlDocument&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;();&lt;BR&gt;doc.LoadXml(text);&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;long&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; docToXDoc = Time(1000, () =&amp;gt; DocumentToXDocument(doc));&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;long&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; docToXDocNavigator = Time(1000, () =&amp;gt; DocumentToXDocumentNavigator(doc));&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;long&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; docToXDocReader = Time(1000, () =&amp;gt; DocumentToXDocumentReader(doc));&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;Note that the actual numbers don't matter much, as this is my laptop running a bunch of things in the background, in the debugger and whatnot, but the relative values are interesting to see.&lt;/P&gt;
&lt;P&gt;These are the values I got (they vary a bit each run, but not by much).&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Using OuterXml: 1973 ms.&lt;/LI&gt;
&lt;LI&gt;Using a navigator over the document: 1254 ms.&lt;/LI&gt;
&lt;LI&gt;Using a reader over the document: 1154 ms.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Not surprisingly, avoiding the creation of a big string just to re-parse it is a big win - save the planet, use less CPU power!&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9471290" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/marcelolr/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/marcelolr/archive/tags/XML/default.aspx">XML</category></item></channel></rss>