<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/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>Nguyen Huu Hoa's Blog</title><link>http://weblogs.asp.net/huuhoa/default.aspx</link><description>Blog on building things with ASP.NET</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Isolator for SharePoint</title><link>http://weblogs.asp.net/huuhoa/archive/2008/11/25/isolator-for-sharepoint.aspx</link><pubDate>Tue, 25 Nov 2008 01:42:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6752628</guid><dc:creator>hoanguyen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/huuhoa/rsscomments.aspx?PostID=6752628</wfw:commentRss><comments>http://weblogs.asp.net/huuhoa/archive/2008/11/25/isolator-for-sharepoint.aspx#comments</comments><description>&lt;p&gt;It's great that now you can unit test SharePoint without having a SharePoint server. Here is full quote from typemock &lt;br&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Typemock are offering their new product for &lt;a href="http://www.typemock.com/sharepointpage.php?utm_source=sp_bb&amp;amp;utm_medium=blog_4sp&amp;amp;utm_campaign=sp_bb"&gt;unit testing SharePoint&lt;/a&gt; called Isolator For SharePoint, for a special introduction price. it is the only tool that allows you to &lt;a href="http://blog.typemock.com/2008/11/newisolatorforsharepointtoolforunittest.html?utm_source=typeblog&amp;amp;utm_medium=sp_bb&amp;amp;utm_campaign=typeblog"&gt;unit test SharePoint&lt;/a&gt; without a SharePoint server. To learn more &lt;a href="http://www.typemock.com/sharepointpage.php?utm_source=sp_bb&amp;amp;utm_medium=blog_4sp&amp;amp;utm_campaign=sp_bb"&gt;click here&lt;/a&gt;.   &lt;strong&gt;The first 50 bloggers &lt;/strong&gt;who blog this text in their blog and tell us about it, will get &lt;font color="#ff0000"&gt;a Full Isolator license, Free&lt;/font&gt;. for rules and info &lt;a href="http://blog.typemock.com/2008/11/newisolatorforsharepointtoolforunittest.html"&gt;click here&lt;/a&gt;.&amp;nbsp; &lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6752628" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/huuhoa/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Parsing OneNote XML with LINQ to XML</title><link>http://weblogs.asp.net/huuhoa/archive/2008/01/25/parsing-onenote-xml-with-linq-to-xml.aspx</link><pubDate>Thu, 24 Jan 2008 17:21:31 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5644736</guid><dc:creator>hoanguyen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/huuhoa/rsscomments.aspx?PostID=5644736</wfw:commentRss><comments>http://weblogs.asp.net/huuhoa/archive/2008/01/25/parsing-onenote-xml-with-linq-to-xml.aspx#comments</comments><description>&lt;p&gt;Recently I was involved in a small project (&lt;a href="http://www.codeplex.com/onenote2pdf"&gt;http://www.codeplex.com/onenote2pdf&lt;/a&gt;) to write a command-line utility to export entire OneNote's notebook/section/or section group to a PDF file with some customization in PDF output such as Table of Contents, Bookmark, etc.&lt;/p&gt;  &lt;p&gt;OneNote 2007 supports some level of interacting with external application by means of API, and there is an API that export entire structure of a notebook including its sections, sectiongroups, and pages at all level into XML string.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/huuhoa/WindowsLiveWriter/ParsingOneNoteXMLwithLINQtoXML_4DA/clip_image001_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="269" alt="clip_image001" src="http://weblogs.asp.net/blogs/huuhoa/WindowsLiveWriter/ParsingOneNoteXMLwithLINQtoXML_4DA/clip_image001_thumb.png" width="735" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As you can see, the XML exported by OneNote contains notebook hierarchy: &lt;em&gt;Notebook&lt;/em&gt; node can contain many &lt;em&gt;Section&lt;/em&gt; and &lt;em&gt;SectionGroup&lt;/em&gt; nodes, SectionGroup node can contain many &lt;em&gt;Section&lt;/em&gt; and nested &lt;em&gt;SectionGroup&lt;/em&gt; nodes, and &lt;em&gt;Section&lt;/em&gt; node contains only &lt;em&gt;Page&lt;/em&gt; nodes.&lt;/p&gt;  &lt;p&gt;My task was build the hierarchy of notebook, sectiongroups, sections, and pages from exported XML. With the help of LINQ, parsing this XML string is rather simple task. However, due to the recursive nature of data, I have to implement some recursive functions to build the entire hierarchy.&lt;/p&gt;  &lt;p&gt;First, get the desired notebook information such as name, ID from input XML&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: green"&gt;// Define XML namespace
&lt;/span&gt;&lt;span style="color: #2b91af"&gt;XNamespace &lt;/span&gt;&lt;span style="color: #010001"&gt;oneNS &lt;/span&gt;&lt;span style="color: #010001"&gt;&lt;/span&gt;= &lt;br /&gt;  &lt;span style="color: #a31515"&gt;&amp;quot;http://schemas.microsoft.com/office/onenote/2007/onenote&amp;quot;&lt;/span&gt;; 
&lt;span style="color: #2b91af"&gt;XDocument &lt;/span&gt;&lt;span style="color: #010001"&gt;outputXML &lt;/span&gt;= &lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt;.&lt;span style="color: #010001"&gt;Parse&lt;/span&gt;(&lt;span style="color: #010001"&gt;OneNoteNoteBookXML&lt;/span&gt;);
&lt;span style="color: #010001"&gt;notebook &lt;/span&gt;= &lt;br /&gt;    (&lt;span style="color: red"&gt;from &lt;/span&gt;&lt;span style="color: #010001"&gt;nb &lt;/span&gt;&lt;span style="color: red"&gt;in &lt;/span&gt;&lt;span style="color: #010001"&gt;outputXML&lt;/span&gt;.&lt;span style="color: #010001"&gt;Descendants&lt;/span&gt;(&lt;span style="color: #010001"&gt;oneNS &lt;/span&gt;+ &lt;span style="color: #a31515"&gt;&amp;quot;Notebook&amp;quot;&lt;/span&gt;)
     &lt;span style="color: red"&gt;select new &lt;/span&gt;&lt;span style="color: #010001"&gt;Data&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;ONNotebook
     &lt;/span&gt;{
         &lt;span style="color: #010001"&gt;Name &lt;/span&gt;= &lt;span style="color: #010001"&gt;nb&lt;/span&gt;.&lt;span style="color: #010001"&gt;Attribute&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;).&lt;span style="color: #010001"&gt;Value&lt;/span&gt;,
         &lt;span style="color: #010001"&gt;ID &lt;/span&gt;= &lt;span style="color: #010001"&gt;nb&lt;/span&gt;.&lt;span style="color: #010001"&gt;Attribute&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt;).&lt;span style="color: #010001"&gt;Value&lt;/span&gt;,
         &lt;span style="color: #010001"&gt;Sections &lt;/span&gt;= &lt;span style="color: #010001"&gt;&lt;strong&gt;SelectSections&lt;/strong&gt;&lt;/span&gt;(&lt;span style="color: #010001"&gt;nb&lt;/span&gt;),
     }).&lt;span style="color: #010001"&gt;First&lt;/span&gt;();&lt;/pre&gt;

&lt;p&gt;In the above code snippet, function &lt;span style="color: #010001"&gt;SelectSections&lt;/span&gt; was called to build Section/SectionGroup hierarchy for the desired notebook.&lt;/p&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;span style="color: red"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #010001"&gt;Data&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;ONSection&lt;/span&gt;&amp;gt; &lt;span style="color: #010001"&gt;SelectSections&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;XElement &lt;/span&gt;&lt;span style="color: #010001"&gt;xml&lt;/span&gt;)
{
    &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #010001"&gt;Data&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;ONSection&lt;/span&gt;&amp;gt; &lt;span style="color: #010001"&gt;sections &lt;/span&gt;=
        (&lt;span style="color: red"&gt;from &lt;/span&gt;&lt;span style="color: #010001"&gt;section &lt;/span&gt;&lt;span style="color: red"&gt;in &lt;/span&gt;&lt;span style="color: #010001"&gt;xml&lt;/span&gt;.&lt;span style="color: #010001"&gt;Elements&lt;/span&gt;()
         &lt;span style="color: red"&gt;where &lt;br /&gt;             &lt;/span&gt;(&lt;span style="color: #010001"&gt;section&lt;/span&gt;.&lt;span style="color: #010001"&gt;Name &lt;/span&gt;== &lt;span style="color: #010001"&gt;oneNS &lt;/span&gt;+ &lt;span style="color: #a31515"&gt;&amp;quot;SectionGroup&amp;quot;&lt;/span&gt;) ||&lt;br /&gt;             (&lt;span style="color: #010001"&gt;section&lt;/span&gt;.&lt;span style="color: #010001"&gt;Name &lt;/span&gt;== &lt;span style="color: #010001"&gt;oneNS &lt;/span&gt;+ &lt;span style="color: #a31515"&gt;&amp;quot;Section&amp;quot;&lt;/span&gt;)
         &lt;span style="color: green"&gt;// orderby section.Value
         &lt;/span&gt;&lt;span style="color: red"&gt;select new &lt;/span&gt;&lt;span style="color: #010001"&gt;Data&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;ONSection
         &lt;/span&gt;{
             &lt;span style="color: #010001"&gt;Name &lt;/span&gt;= &lt;span style="color: #010001"&gt;section&lt;/span&gt;.&lt;span style="color: #010001"&gt;Attribute&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;).&lt;span style="color: #010001"&gt;Value&lt;/span&gt;,
             &lt;span style="color: #010001"&gt;ID &lt;/span&gt;= &lt;span style="color: #010001"&gt;section&lt;/span&gt;.&lt;span style="color: #010001"&gt;Attribute&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt;).&lt;span style="color: #010001"&gt;Value&lt;/span&gt;,
             &lt;span style="color: #010001"&gt;SubSections &lt;/span&gt;= &lt;span style="color: #010001"&gt;&lt;strong&gt;SelectSections&lt;/strong&gt;&lt;/span&gt;(&lt;span style="color: #010001"&gt;section&lt;/span&gt;),
             &lt;span style="color: #010001"&gt;Pages &lt;/span&gt;= &lt;span style="color: #010001"&gt;&lt;strong&gt;SelectPages&lt;/strong&gt;&lt;/span&gt;(&lt;span style="color: #010001"&gt;section&lt;/span&gt;),
         }).&lt;span style="color: #010001"&gt;ToList&lt;/span&gt;();
    &lt;span style="color: red"&gt;return &lt;/span&gt;&lt;span style="color: #010001"&gt;sections&lt;/span&gt;;
}&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;span style="color: green"&gt;// Get page information out of XML&lt;/span&gt;
&lt;span style="color: red"&gt;&lt;br /&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #010001"&gt;Data&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;ONPage&lt;/span&gt;&amp;gt; &lt;span style="color: #010001"&gt;SelectPages&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;XElement &lt;/span&gt;&lt;span style="color: #010001"&gt;xml&lt;/span&gt;)
{
    &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #010001"&gt;Data&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;ONPage&lt;/span&gt;&amp;gt; &lt;span style="color: #010001"&gt;pages &lt;/span&gt;=
        (&lt;span style="color: red"&gt;from &lt;/span&gt;&lt;span style="color: #010001"&gt;page &lt;/span&gt;&lt;span style="color: red"&gt;in &lt;/span&gt;&lt;span style="color: #010001"&gt;xml&lt;/span&gt;.&lt;span style="color: #010001"&gt;Elements&lt;/span&gt;(&lt;span style="color: #010001"&gt;oneNS &lt;/span&gt;+ &lt;span style="color: #a31515"&gt;&amp;quot;Page&amp;quot;&lt;/span&gt;)
         &lt;span style="color: green"&gt;// orderby section.Value
         &lt;/span&gt;&lt;span style="color: red"&gt;select new &lt;/span&gt;&lt;span style="color: #010001"&gt;Data&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;ONPage
         &lt;/span&gt;{
             &lt;span style="color: #010001"&gt;Name &lt;/span&gt;= &lt;span style="color: #010001"&gt;page&lt;/span&gt;.&lt;span style="color: #010001"&gt;Attribute&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;).&lt;span style="color: #010001"&gt;Value&lt;/span&gt;,
             &lt;span style="color: #010001"&gt;ID &lt;/span&gt;= &lt;span style="color: #010001"&gt;page&lt;/span&gt;.&lt;span style="color: #010001"&gt;Attribute&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt;).&lt;span style="color: #010001"&gt;Value&lt;/span&gt;,
         }).&lt;span style="color: #010001"&gt;ToList&lt;/span&gt;();
    &lt;span style="color: red"&gt;return &lt;/span&gt;&lt;span style="color: #010001"&gt;pages&lt;/span&gt;;
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;So with the help of LINQ to XML, we can parse a very complex XML file with ease.&lt;/p&gt;

&lt;p&gt;Happy Coding!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5644736" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/huuhoa/archive/tags/XML/default.aspx">XML</category><category domain="http://weblogs.asp.net/huuhoa/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/huuhoa/archive/tags/OneNote/default.aspx">OneNote</category></item><item><title>Hello World</title><link>http://weblogs.asp.net/huuhoa/archive/2008/01/24/hello-world.aspx</link><pubDate>Wed, 23 Jan 2008 17:48:09 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5640305</guid><dc:creator>hoanguyen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/huuhoa/rsscomments.aspx?PostID=5640305</wfw:commentRss><comments>http://weblogs.asp.net/huuhoa/archive/2008/01/24/hello-world.aspx#comments</comments><description>&lt;p&gt;hi all, just to let the world knows that this is my official blog on .NET technologies. I will post my experiments on the way to learn .NET tech. here to share with the community. That's all for now.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5640305" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/huuhoa/archive/tags/hello/default.aspx">hello</category></item></channel></rss>