<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://devlicio.us/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>Derik Whittaker : Mini-Series</title><link>http://devlicio.us/blogs/derik_whittaker/archive/tags/Mini-Series/default.aspx</link><description>Tags: Mini-Series</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>XLinq'n in the new world - Speed comparison with Xml/XPath</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/14/xlinq-n-in-the-new-world-speed-comparison-with-xml-xpath.aspx</link><pubDate>Wed, 14 May 2008 15:02:22 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40565</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=40565</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=40565</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/14/xlinq-n-in-the-new-world-speed-comparison-with-xml-xpath.aspx#comments</comments><description>&lt;p&gt;Originally this series was meant to be titled &amp;#39;Any thing you can do I can do better&amp;#39;, but to be honest after writing the Xml/XPath examples I realized the XLinq is really no better per say than Xml/XPath.&amp;#160; However, what XLinq does bring to the table that Xml/XPath does not:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Does not need to use the XPath query syntax &lt;/li&gt;    &lt;li&gt;Reads like English (mostly) when creating queries &lt;/li&gt;    &lt;li&gt;Lower barrier to entry for someone new to Xml (my opinion) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For Part 1 of this series check &lt;a href="http://devlicio.us/blogs/derik_whittaker/archive/2008/05/12/xlinq-n-in-the-new-world-data-access-comparisons-with-xml-xpath.aspx"&gt;here&lt;/a&gt;     &lt;br /&gt;For Part 2 of this series check &lt;a href="http://devlicio.us/blogs/derik_whittaker/archive/2008/05/13/xlinq-n-in-the-new-world-data-manipulation-comparisons-with-xml-xpath.aspx"&gt;here&lt;/a&gt;     &lt;br /&gt;For Part 3 of this series check &lt;a href="http://devlicio.us/blogs/derik_whittaker/archive/2008/05/14/xlinq-n-in-the-new-world-structure-modification-comparisons-with-xml-xpath.aspx"&gt;here&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In Part 4 of this little mini-series we will examine the speed differences between XLinq and Xml/XPath.&lt;/p&gt;  &lt;p&gt;Before I get started I will show you a sample of the XML document I am using.&amp;#160; The sample document I am using today is 5.25mb in size.&lt;/p&gt;  &lt;p&gt;&amp;lt;?xml version=&amp;#39;1.0&amp;#39;?&amp;gt;    &lt;br /&gt;&amp;lt;root&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;system&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscriber Type=&amp;quot;Random&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id&amp;gt;63425813&amp;lt;/id&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Email__Address&amp;gt;FakeAddress@comcast.net&amp;lt;/Email__Address&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EmailType&amp;gt;HTML&amp;lt;/EmailType&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Status&amp;gt;InActive&amp;lt;/Status&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;First__Name&amp;gt;RAY&amp;lt;/First__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Last__Name&amp;gt;Bob&amp;lt;/Last__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIN__Code&amp;gt;NaN&amp;lt;/PIN__Code&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIPIN&amp;gt;33232&amp;lt;/PIPIN&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;UID&amp;gt;418444&amp;lt;/UID&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ProgNum&amp;gt;0&amp;lt;/ProgNum&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Title /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Username /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Password /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id&amp;gt;1271728821&amp;lt;/id&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Email__Address&amp;gt;FakeAddress@yahoo.com&amp;lt;/Email__Address&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EmailType&amp;gt;HTML&amp;lt;/EmailType&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Status&amp;gt;InActive&amp;lt;/Status&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;First__Name&amp;gt;JOHN&amp;lt;/First__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Last__Name&amp;gt;Foo&amp;lt;/Last__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIN__Code&amp;gt;NaN&amp;lt;/PIN__Code&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIPIN&amp;gt;1254512&amp;lt;/PIPIN&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;UID&amp;gt;1033488&amp;lt;/UID&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ProgNum /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Title /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Username /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Password /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/system&amp;gt;     &lt;br /&gt;&amp;lt;/root&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Example 1 - Loading a XML document from Resource Stream&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;There is no real code to show here, but I do have some speed numbers to chat about.&amp;#160; I ran my test 2 times. The first time I loaded into a XLinq object first then into an XmlDocument object and for the second run, I swapped the order.&lt;/p&gt;  &lt;p&gt;As it turns out the first document to load each time is slower, but you can get a look at the speed difference by looking at the delta between each load time.&lt;/p&gt;  &lt;p&gt;Load Time&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;XmlDocument&lt;/td&gt;        &lt;td&gt;515.00&lt;/td&gt;        &lt;td&gt;327.72&lt;/td&gt;        &lt;td&gt;187.27 (Delta)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;XLinq&lt;/td&gt;        &lt;td&gt;358.94&lt;/td&gt;        &lt;td&gt;546.2135&lt;/td&gt;        &lt;td&gt;187.27 (Delta)&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;By looking at the above, there is no real speed difference, which I expected. (Time above is in milliseconds)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Example 2 - Finding a Unique value in the Xml Document&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;For this example I decided to try to find a single node inside my larger xml file.&amp;#160; In order to try to get good sample I ran each test 5 times and the times below are the average of all those runs&lt;/p&gt;  &lt;p&gt;Run time (5 run avg)&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;XLinq&lt;/td&gt;        &lt;td&gt;44.62&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Xml/XPath&lt;/td&gt;        &lt;td&gt;125.65&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;I have to say that I was kinda surprised by the results.&amp;#160; I figured that the Xml/XPath way would be a little faster, but turns out it is 3 times slower. (Time above is in milliseconds). ** NOTE *** The times above do NOT include the time needed to load the XML document into the correct object model.&lt;/p&gt;  &lt;p&gt;From the information in this mini-series i would conclude that if you need to do any type of XML reading/manipulation/creation I would make the jump over to using XLinq as your preferred way of doing so.&lt;/p&gt;  &lt;p&gt;Till next time,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40565" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Linq/default.aspx">Linq</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Mini-Series/default.aspx">Mini-Series</category></item><item><title>XLinq'n in the new world - Structure Modification comparisons with Xml/XPath</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/14/xlinq-n-in-the-new-world-structure-modification-comparisons-with-xml-xpath.aspx</link><pubDate>Wed, 14 May 2008 12:21:19 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40559</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=40559</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=40559</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/14/xlinq-n-in-the-new-world-structure-modification-comparisons-with-xml-xpath.aspx#comments</comments><description>&lt;p&gt;Originally this series was meant to be titled &amp;#39;Any thing you can do I can do better&amp;#39;, but to be honest after writing the Xml/XPath examples I realized the XLinq is really no better per say than Xml/XPath.&amp;#160; However, what XLinq does bring to the table that Xml/XPath does not:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Does not need to use the XPath query syntax &lt;/li&gt;    &lt;li&gt;Reads like English (mostly) when creating queries &lt;/li&gt;    &lt;li&gt;Lower barrier to entry for someone new to Xml (my opinion) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For Part 1 of this series check &lt;a href="http://devlicio.us/blogs/derik_whittaker/archive/2008/05/12/xlinq-n-in-the-new-world-data-access-comparisons-with-xml-xpath.aspx"&gt;here&lt;/a&gt;     &lt;br /&gt;For Part 2 of this series check &lt;a href="http://devlicio.us/blogs/derik_whittaker/archive/2008/05/13/xlinq-n-in-the-new-world-data-manipulation-comparisons-with-xml-xpath.aspx"&gt;here&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In Part 3 of this little mini series we will examine some common data creation scenario&amp;#39;s and how XLinq&amp;#39;s syntax compares to that of standard Xml/XPath access.&amp;#160; In general will we review how to modify the structure of an existing Xml document.&lt;/p&gt;  &lt;p&gt;Before I get started I will show you a sample of the XML document I am using.&lt;/p&gt;  &lt;p&gt;&amp;lt;?xml version=&amp;#39;1.0&amp;#39;?&amp;gt;    &lt;br /&gt;&amp;lt;root&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;system&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscriber Type=&amp;quot;Random&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id&amp;gt;63425813&amp;lt;/id&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Email__Address&amp;gt;FakeAddress@comcast.net&amp;lt;/Email__Address&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EmailType&amp;gt;HTML&amp;lt;/EmailType&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Status&amp;gt;InActive&amp;lt;/Status&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;First__Name&amp;gt;RAY&amp;lt;/First__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Last__Name&amp;gt;Bob&amp;lt;/Last__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIN__Code&amp;gt;NaN&amp;lt;/PIN__Code&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIPIN&amp;gt;33232&amp;lt;/PIPIN&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;UID&amp;gt;418444&amp;lt;/UID&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ProgNum&amp;gt;0&amp;lt;/ProgNum&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Title /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Username /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Password /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id&amp;gt;1271728821&amp;lt;/id&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Email__Address&amp;gt;FakeAddress@yahoo.com&amp;lt;/Email__Address&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EmailType&amp;gt;HTML&amp;lt;/EmailType&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Status&amp;gt;InActive&amp;lt;/Status&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;First__Name&amp;gt;JOHN&amp;lt;/First__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Last__Name&amp;gt;Foo&amp;lt;/Last__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIN__Code&amp;gt;NaN&amp;lt;/PIN__Code&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIPIN&amp;gt;1254512&amp;lt;/PIPIN&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;UID&amp;gt;1033488&amp;lt;/UID&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ProgNum /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Title /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Username /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Password /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/system&amp;gt;     &lt;br /&gt;&amp;lt;/root&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Example 1 - Adding a New Node w/ Element&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;via Xml/XPath&lt;/p&gt;  &lt;pre class="c-sharp" name="code"&gt;// notice the @ is missing on the status -- this is how u search a node
XmlDocument xmlDocument = XmlHelper.GetRawSnippetAsXmlDocument();
XmlNodeList xmlNodeList = xmlDocument.SelectNodes( &amp;quot;//list&amp;quot; );

foreach ( XmlElement element in xmlNodeList )
{
    XmlNode newNode = xmlDocument.CreateNode( XmlNodeType.Element, &amp;quot;NewElement&amp;quot;, string.Empty );
    XmlAttribute nodeAttribute = xmlDocument.CreateAttribute( &amp;quot;MyAttribute&amp;quot; );
    nodeAttribute.Value = &amp;quot;MyValue&amp;quot;;

    newNode.Attributes.Append( nodeAttribute );

    element.AppendChild( newNode );
}&lt;/pre&gt;

&lt;p&gt;Via XLinq&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;XDocument xDocument = XmlHelper.GetRawSnippetAsXDocument();

IEnumerable item = from doc in xDocument.Descendants( &amp;quot;list&amp;quot; )
                             select doc;

foreach ( XElement xElement in item )
{
    xElement.Add( new XElement( &amp;quot;NewElement&amp;quot;,
                                new XAttribute( &amp;quot;MyAttribute&amp;quot;, &amp;quot;MyValue&amp;quot; ),
                                new XElement( &amp;quot;ChildElement&amp;quot;, &amp;quot;ChildValue&amp;quot;)) );
}

//ChildValue&lt;/pre&gt;

&lt;p&gt;One of the big differences you will notice when trying to add nodes/elements to an existing Xml doc with XLinq vs. Xml/XPath is the that with XLinq it is more &amp;#39;fluent&amp;#39; then with Xml/XPath.&amp;#160; To add nodes/elements with Xml/XPath you need to create the nodes/elements via the XMLdocument object.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 2 - Deleting and Node w/ Elements&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;via Xml/XPath&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;// notice the @ is missing on the status -- this is how u search a node
XmlDocument xmlDocument = XmlHelper.GetRawSnippetAsXmlDocument();
XmlNodeList xmlNodeList = xmlDocument.SelectNodes( &amp;quot;//subscribers/subscriber[Status=&amp;#39;InActive&amp;#39;]&amp;quot; );

foreach ( XmlElement element in xmlNodeList )
{
    element.RemoveAll();
}&lt;/pre&gt;

&lt;p&gt;Via XLinq&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;XDocument xDocument = XmlHelper.GetRawSnippetAsXDocument();

IEnumerable&amp;lt; XElement &amp;gt; item = from doc in xDocument.Descendants( &amp;quot;subscriber&amp;quot; )
                               let status = (string) doc.Element( &amp;quot;Status&amp;quot; )
                               where status == &amp;quot;InActive&amp;quot;
                               select doc;

foreach ( XElement xElement in item )
{
    xElement.Remove();
}&lt;/pre&gt;

&lt;p&gt;Besides the way you navigate to the node/element you would like to remove the syntax to delete/remove the nodes are really no different.&amp;#160; But, again with XLinq you do not need to know XPath in order to navigate to the correct location in the document.&lt;/p&gt;

&lt;p&gt;Well, this pretty much wraps up my little mini-series on XLinq&amp;#39;n in the new world.&amp;#160; I hope that in the past 3 posts you have learned a little about how to use XLinq and how it differs from Xml/XPath.&lt;/p&gt;

&lt;p&gt;Till next time,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40559" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Linq/default.aspx">Linq</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Mini-Series/default.aspx">Mini-Series</category></item><item><title>XLinq'n in the new world - Data manipulation comparisons with Xml/XPath</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/13/xlinq-n-in-the-new-world-data-manipulation-comparisons-with-xml-xpath.aspx</link><pubDate>Tue, 13 May 2008 10:37:51 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40487</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=40487</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=40487</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/13/xlinq-n-in-the-new-world-data-manipulation-comparisons-with-xml-xpath.aspx#comments</comments><description>&lt;p&gt;Originally this series was meant to be titled &amp;#39;Any thing you can do I can do better&amp;#39;, but to be honest after writing the Xml/XPath examples I realized the XLinq is really no better per say than Xml/XPath.&amp;#160; However, what XLinq does bring to the table that Xml/XPath does not:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Does not need to use the XPath query syntax &lt;/li&gt;    &lt;li&gt;Reads like English (mostly) when creating queries &lt;/li&gt;    &lt;li&gt;Lower barrier to entry for someone new to Xml (my opinion) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For Part 1 of this series check &lt;a href="http://devlicio.us/blogs/derik_whittaker/archive/2008/05/12/xlinq-n-in-the-new-world-data-access-comparisons-with-xml-xpath.aspx"&gt;here&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In Part 2 of this little mini series we will examine some common data manipulation scenario&amp;#39;s and how XLinq&amp;#39;s syntax compares to that of standard Xml/XPath access.&amp;#160; In general will we review how do update the content of both elements and attributes in an XML document.&lt;/p&gt;  &lt;p&gt;Before I get started I will show you a sample of the XML document I am using.&lt;/p&gt;  &lt;p&gt;&amp;lt;?xml version=&amp;#39;1.0&amp;#39;?&amp;gt;    &lt;br /&gt;&amp;lt;root&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;system&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscriber Type=&amp;quot;Random&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id&amp;gt;63425813&amp;lt;/id&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Email__Address&amp;gt;FakeAddress@comcast.net&amp;lt;/Email__Address&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EmailType&amp;gt;HTML&amp;lt;/EmailType&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Status&amp;gt;InActive&amp;lt;/Status&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;First__Name&amp;gt;RAY&amp;lt;/First__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Last__Name&amp;gt;Bob&amp;lt;/Last__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIN__Code&amp;gt;NaN&amp;lt;/PIN__Code&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIPIN&amp;gt;33232&amp;lt;/PIPIN&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;UID&amp;gt;418444&amp;lt;/UID&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ProgNum&amp;gt;0&amp;lt;/ProgNum&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Title /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Username /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Password /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id&amp;gt;1271728821&amp;lt;/id&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Email__Address&amp;gt;FakeAddress@yahoo.com&amp;lt;/Email__Address&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EmailType&amp;gt;HTML&amp;lt;/EmailType&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Status&amp;gt;InActive&amp;lt;/Status&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;First__Name&amp;gt;JOHN&amp;lt;/First__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Last__Name&amp;gt;Foo&amp;lt;/Last__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIN__Code&amp;gt;NaN&amp;lt;/PIN__Code&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIPIN&amp;gt;1254512&amp;lt;/PIPIN&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;UID&amp;gt;1033488&amp;lt;/UID&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ProgNum /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Title /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Username /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Password /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/system&amp;gt;     &lt;br /&gt;&amp;lt;/root&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Example 1 - Updating Element Values&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;via Xml/XPath&lt;/p&gt;  &lt;pre class="c-sharp" name="code"&gt;// notice the @ is missing on the status -- this is how u search a node
XmlDocument xmlDocument = XmlHelper.GetRawSnippetAsXmlDocument();
XmlNodeList xmlNodeList = xmlDocument.SelectNodes( &amp;quot;//subscribers/subscriber[Status=&amp;#39;InActive&amp;#39;]&amp;quot; );

// Attribute value before updates
// 
// 

foreach ( XmlElement element in xmlNodeList )
{
    // this will only set the value.  if the node does NOT exist you will get an exception.
    element.SelectSingleNode( &amp;quot;//Status&amp;quot; ).InnerText = &amp;quot;Active&amp;quot;;
}

// Attribute values afterupdate
// &lt;/pre&gt;

&lt;p&gt;via XLinq&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;XDocument xDocument = XmlHelper.GetRawSnippetAsXDocument();

var item = from doc in xDocument.Descendants( &amp;quot;subscriber&amp;quot; )
           let status = ( string )doc.Element( &amp;quot;Status&amp;quot; )
           where status == &amp;quot;InActive&amp;quot;
           select doc;

// Attribute value before updates
// InActive

foreach ( XElement xElement in item )
{
    // this will set the value or create it if the element does not exist
    xElement.SetElementValue( &amp;quot;Status&amp;quot;, &amp;quot;Active&amp;quot; );

    // Another option is to go after the element directly, but this requires a 
    //  null check first
    if ( xElement.Element( &amp;quot;Status&amp;quot; ) != null )
    {
        xElement.Element( &amp;quot;Status&amp;quot; ).SetValue( &amp;quot;Active&amp;quot; );
    }

}

// Attribute values after update
// Active&lt;/pre&gt;

&lt;p&gt;As you can see the differences between using XLinq and Xml/XPath for updating elements is not the big.&amp;#160; However, again you have to know/understand how to use XPath to find your nodes.&amp;#160; There is ONE thing you need to be aware of though.&amp;#160; When trying to update an element via XPath the element MUST exist.&amp;#160; If it does not you will get a runtime exception.&amp;#160; With XLinq there is a way to do this and not have to worry about that.&amp;#160; To me that is pretty nice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 2 - Updating Attribute Values&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;via Xml/XPath&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;// notice the @ is missing on the status -- this is how u search a node
XmlDocument xmlDocument = XmlHelper.GetRawSnippetAsXmlDocument();
XmlNodeList xmlNodeList = xmlDocument.SelectNodes( &amp;quot;//subscribers/subscriber[Status=&amp;#39;InActive&amp;#39;]&amp;quot; );

// Attribute value before updates
// 

foreach ( XmlElement element in xmlNodeList )
{
    // this will set the value or create it if the attribute does not exist
    element.SetAttribute( &amp;quot;Type&amp;quot;, &amp;quot;SomeValue&amp;quot; );
}

// Attribute values afterupdate
// &lt;/pre&gt;

&lt;p&gt;via XLinq&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;XDocument xDocument = XmlHelper.GetRawSnippetAsXDocument();

var item = from doc in xDocument.Descendants( &amp;quot;subscriber&amp;quot; )
           let status = ( string )doc.Element( &amp;quot;Status&amp;quot; )
           where status == &amp;quot;InActive&amp;quot;
           select doc;

// Attribute value before updates
// 

foreach ( XElement xElement in item )
{
    // this will set the value or create it if the attribute does not exist
    xElement.SetAttributeValue( &amp;quot;Type&amp;quot;, &amp;quot;MyValue&amp;quot; );

    // Another option is to go after the attribute directly, but this requires a 
    //  null check first
    if ( xElement.Attribute( &amp;quot;Type&amp;quot; ) != null )
    {
        xElement.Attribute( &amp;quot;Type&amp;quot; ).SetValue( &amp;quot;SomeValue&amp;quot; );
    }
    
}

// Attribute values afterupdate
// &lt;/pre&gt;

&lt;p&gt;Above shows you that updating attributes are almost identical and in this case there is no need to know/understand XPath in order to select the single node you are trying to update. &lt;/p&gt;

&lt;p&gt;Well, above I have shown you a few simple examples that compare Xml/Path to XLinq, I hope you find this useful.&amp;#160; The next post will compare how to modify the structure of a document using the both Xml/XPath and XLinq.&lt;/p&gt;

&lt;p&gt;Till next time,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40487" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Linq/default.aspx">Linq</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Mini-Series/default.aspx">Mini-Series</category></item><item><title>XLinq'n in the new world - Data access comparisons with Xml/XPath</title><link>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/12/xlinq-n-in-the-new-world-data-access-comparisons-with-xml-xpath.aspx</link><pubDate>Mon, 12 May 2008 10:15:22 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40471</guid><dc:creator>Derik Whittaker</dc:creator><slash:comments>13</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/rsscomments.aspx?PostID=40471</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/derik_whittaker/commentapi.aspx?PostID=40471</wfw:comment><comments>http://devlicio.us/blogs/derik_whittaker/archive/2008/05/12/xlinq-n-in-the-new-world-data-access-comparisons-with-xml-xpath.aspx#comments</comments><description>&lt;p&gt;Originally this series was meant to be titled &amp;#39;Any thing you can do I can do better&amp;#39;, but to be honest after writing the Xml/XPath examples I realized the XLinq is really no better per say than Xml/XPath.&amp;#160; However, what XLinq does bring to the table that Xml/XPath does not:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Does not need to use the XPath query syntax &lt;/li&gt;    &lt;li&gt;Reads like English (mostly) when creating queries &lt;/li&gt;    &lt;li&gt;Lower barrier to entry for someone new to Xml (my opinion) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In Part 1 of this little mini series we will examine some common data access scenario&amp;#39;s and how XLinq&amp;#39;s syntax compares to that of standard Xml/XPath access.&lt;/p&gt;  &lt;p&gt;Before I get started I will show you a sample of the XML document I am using.&lt;/p&gt;  &lt;p&gt;&amp;lt;?xml version=&amp;#39;1.0&amp;#39;?&amp;gt;    &lt;br /&gt;&amp;lt;root&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;system&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscriber Type=&amp;quot;Random&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id&amp;gt;63425813&amp;lt;/id&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Email__Address&amp;gt;FakeAddress@comcast.net&amp;lt;/Email__Address&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EmailType&amp;gt;HTML&amp;lt;/EmailType&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Status&amp;gt;InActive&amp;lt;/Status&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;First__Name&amp;gt;RAY&amp;lt;/First__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Last__Name&amp;gt;Bob&amp;lt;/Last__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIN__Code&amp;gt;NaN&amp;lt;/PIN__Code&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIPIN&amp;gt;33232&amp;lt;/PIPIN&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;UID&amp;gt;418444&amp;lt;/UID&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ProgNum&amp;gt;0&amp;lt;/ProgNum&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Title /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Username /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Password /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;list&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id&amp;gt;1271728821&amp;lt;/id&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Email__Address&amp;gt;FakeAddress@yahoo.com&amp;lt;/Email__Address&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EmailType&amp;gt;HTML&amp;lt;/EmailType&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Status&amp;gt;InActive&amp;lt;/Status&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;First__Name&amp;gt;JOHN&amp;lt;/First__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Last__Name&amp;gt;Foo&amp;lt;/Last__Name&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIN__Code&amp;gt;NaN&amp;lt;/PIN__Code&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;PIPIN&amp;gt;1254512&amp;lt;/PIPIN&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;UID&amp;gt;1033488&amp;lt;/UID&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ProgNum /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Title /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Username /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Password /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscriber&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/subscribers&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/list&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/system&amp;gt;     &lt;br /&gt;&amp;lt;/root&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Example 1 - Simple data access&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;via Xml/XPath&lt;/p&gt;  &lt;pre class="c-sharp" name="code"&gt;XmlDocument xmlDocument = XmlHelper.GetRawSnippetAsXmlDocument();

// notice the @ is on the status -- this is how u search a element
Int32 listCount = xmlDocument.SelectNodes( &amp;quot;//list&amp;quot; ).Count;
Int32 subscribersCount = xmlDocument.SelectNodes( &amp;quot;//subscriber[@Type=&amp;#39;Random&amp;#39;]&amp;quot; ).Count;&lt;/pre&gt;

&lt;p&gt;via XLinq&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;XDocument xDocument = XmlHelper.GetRawSnippetAsXDocument();

Int32 listCount = xDocument.Descendants( &amp;quot;list&amp;quot; ).Count();
Int32 subscribersCount = xDocument.Descendants( &amp;quot;subscriber&amp;quot; ).Attributes( &amp;quot;Type&amp;quot; ).Where( e =&amp;gt; e.Value == &amp;quot;Random&amp;quot; ).Count();&lt;/pre&gt;

&lt;p&gt;As you can see both examples are pretty light on the code and are pretty straight forward.&amp;#160; This is one case where the new XLinq syntax is really no better/simpler then the Xml/XPath syntax.&amp;#160; The issue with the XPath syntax is that&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 2 - Get a list of nodes that match our search criteria&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;via Xml/Xpath&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;// notice the @ is missing on the status -- this is how u search a node
XmlDocument xmlDocument = XmlHelper.GetRawSnippetAsXmlDocument();
XmlNodeList xmlNodeList = xmlDocument.SelectNodes( &amp;quot;//subscribers/subscriber[Status=&amp;#39;InActive&amp;#39;]&amp;quot; );

foreach ( XmlElement element in xmlNodeList )
{
    var id = element.SelectSingleNode( &amp;quot;//id&amp;quot; ).InnerText;
    var type = element.Attributes[ &amp;quot;Type&amp;quot; ].Value;
}&lt;/pre&gt;

&lt;p&gt;via XLinq&lt;/p&gt;

&lt;pre class="c-sharp" name="code"&gt;XDocument xDocument = XmlHelper.GetRawSnippetAsXDocument();

var item = from doc in xDocument.Descendants( &amp;quot;subscriber&amp;quot; )
           let status = (string)doc.Element( &amp;quot;Status&amp;quot; )
           where status == &amp;quot;InActive&amp;quot;
           select doc;

foreach ( XElement xElement in item )
{
    var id = xElement.Element( &amp;quot;id&amp;quot; ).Value;
    var type = xElement.Attribute( &amp;quot;Type&amp;quot; ).Value;
}&lt;/pre&gt;

&lt;p&gt;Now here is an example where I think the XLinq syntax is cleaner and easier to understand.&amp;#160; There is no need to know or understand the XPath syntax, which can be a pain to learn.&amp;#160; Also here you see how XLinq looks a lot like standard SQL syntax and should be familiar to most developers.&lt;/p&gt;

&lt;p&gt;Well, above I have shown you a few simple examples that compare Xml/Path to XLinq, I hope you find this useful.&amp;#160; The next post will compare how to update/add data to a document using the both Xml/XPath and XLinq.&lt;/p&gt;

&lt;p&gt;Till next time,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40471" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Linq/default.aspx">Linq</category><category domain="http://devlicio.us/blogs/derik_whittaker/archive/tags/Mini-Series/default.aspx">Mini-Series</category></item></channel></rss>