New XML Features in .NET Version 2: Part III

XML Data Binding

asp:Feature

LANGUAGES: C#

ASP.NET VERSIONS: 2.0

 

New XML Features in .NET Version 2: Part III

XML Data Binding

 

By Dan Wahlin

 

Version 2 of the .NET Framework provides several new enhancements that make it easier than ever for developers to parse, validate, transform, and bind XML data. Part I of this series demonstrated how to parse XML using new methods found in the XmlReader class and how XML data can be generated using the XmlWriter class. Part II focused on editing XML loaded into memory and validating it using the XmlDocument and XPathNavigator classes. Part II also showed how to perform more efficient XSLT transformations using the new XslCompiledTransform class.

 

In this final article in the series you ll be introduced to several new controls available in ASP.NET 2.0 that simplify working with XML. You ll see how to use the XmlDataSource data source control to bind data to different ASP.NET server controls and be introduced to the TreeView control. Before moving ahead to the new XML features found in version 2, it s worthwhile to take a quick look at how XML data binding occurred in .NET 1.1.

 

XML Data Binding in .NET 1.1

The simplest way to bind XML to server controls in .NET 1.1 was to load an XML document into an XmlDataDocument class and then convert it to a DataSet or simply load a document directly into a DataSet using the ReadXml method. An example of using ReadXml to bind RSS data to a DataList control named dlRss is shown in Figure 1.

 

DataSet ds = new DataSet();

ds.ReadXml("http://msdn.microsoft.com/rss.xml");

//RSS items will be placed into the 3rd DataTable

dlRss.DataSource = ds.Tables[2].DefaultView;

dlRss.DataBind();

Figure 1: Loading XML data into a DataSet using the ReadXml method.

 

If you re new to RSS, Figure 2 shows a simple example of an RSS 2.0 document. Notice that details about an article are marked up using an element. RSS items can have several different child elements that describe an item, such as title, link, pubDate, and creator.

 

 

   XML for ASP.NET Developers

   http://www.xmlforasp.net/XML/RssGenerator.aspx/

   RSS Channel description.

   en-us

   Mon, 23 Jan 2006 14:04:35 GMT

   Mon, 23 Jan 2006 14:04:35 GMT

   XML for ASP.NET Generator

   1440

   

     New XML Features in .NET Version 2

     asp.netPRO Magazine Article

     Dan Wahlin

     Sat, 21 Jan 2006 18:00:00 GMT

   

   

 

Figure 2: RSS documents allow different types of items to be marked up using elements. Although RSS documents are often used to mark up articles, they can be used for many other types of things, including product information, software patches, and more.

 

Once an RSS document such as the one shown in Figure 2 is loaded into a DataSet, the appropriate columns in the DataTable must be bound to the target server control. An example of creating a DataList control ItemTemplate that binds to link and title columns is shown here:

 

 

   <%# DataBinder.Eval(Container.DataItem,"title") %>

 

 

Although this approach doesn t require a lot of code, it does requires you to think of the XML data in a relational manner (rows and columns) rather than hierarchically. It also makes locating the data you want from the original RSS document a little tricky because you need to know which DataTable contains the RSS tags that you want to bind to the DataList. This is because of how the DataSet loads XML data. Each level of nesting found in an XML document causes a new DataTable to be created in the DataSet. The tags in an RSS document are automatically loaded into DataTable #3 because these tags are nested three levels deep in the XML hierarchy.

 

If the RSS data being bound to the DataList control needs to be filtered, you ll need to use the DataView class RowFilter property rather than filtering with a simple XPath expression. An example of filtering out RSS items that don t have the word XML in the title is shown in Figure 3.

 

DataSet ds = new DataSet();

ds.ReadXml("http://msdn.microsoft.com/rss.xml");

DataView view = ds.Tables[2].DefaultView;

view.RowFilter = "title LIKE '%XML%'";

DataList1.DataSource = view;

DataList1.DataBind();

Figure 3: Filtering XML data using the DataView class RowFilter property.

 

This type of code certainly works and is fairly simple to write but it doesn t allow you to leverage XML technologies to their full extent and requires more code than should really be necessary for such a simple task. Let s look at how to eliminate this code completely using new classes available in version 2 of the .NET Framework.

 

Using the XmlDataSource Control

ASP.NET version 2 contains several data source controls that are designed to interact with different types of data sources without writing VB.NET or C# code. Data source controls included in .NET version 2 include SqlDataSource, ObjectDataSource, AccessDataSource, XmlDataSource, and SiteMapDataSource. The XmlDataSource control derives from a new class named HierarchicalDataSourceControl and can be used to bind XML documents to different ASP.NET server controls, such as the DataList, TreeView, and Menu controls. It can also be used to bind data to controls normally used with relational data, such as the GridView and DataList controls.

 

Adding an XmlDataSource control to an ASP.NET Web Form is done by using the tag (see Figure 4). In addition to adding the standard ID and Runat attributes, the control also allows you to define the XML document source using the DataFile property. You can also define what nodes contain the actual data that you want to bind by using the XPath property. The XPath property value shown in Figure 4 instructs the XmlDataSource control to start at the root element, move down to the child element, and then select all elements under (refer to Figure 2 to see how these elements are nested).

 

 DataSourceID="RSSDataSource">

   ...DataList templates

 DataFile="http://msdn.microsoft.com/rss.xml"

 XPath="rss/channel/item"

/>

Figure 4: Binding an XmlDataSource data source control to a DataList control.

 

Binding data contained within the XmlDataSource control can be done by using the DataList s new DataSourceID property, as shown in Figure 4. At run time, the DataList will locate the XmlDataSource control based on its ID, and automatically bind the data.

 

You may be wondering how the DataList knows what data to output as it binds to the XmlDataSource control. The XmlDataSource s XPath property identifies which nodes to bind ( nodes in this example), but RSS nodes can have several different children such as , <link>, <description>, <pubDate>, and more. Just as relational data fields can be bound using the <%# Eval( Fieldname ) %> data binding expression in ASP.NET version 2 Eval replaces the longer DataBinder.Eval(Container.DataItem, FieldName ) syntax found in version 1.1 a new XPath data binding expression can be used to bind to specific XML nodes, as shown in Figure 5. </p> <p>  </p> <p><asp:DataList ID="dlRSSItems" Runat="server"</p> <p> DataSourceID="RSSDataSource"> </p> <p> <ItemTemplate> </p> <p>   <li> </p> <p>      <a style="text-decoration:none;" </p> <p>        href='<%# XPath("link") %>'> </p> <p>        <%# XPath("title") %> </p> <p>      </a></p> <p>   </li>            </p> <p> </ItemTemplate> </p> <p></asp:DataList> </p> <p><asp:XmlDataSource ID="RSSDataSource" Runat="server"</p> <p> DataFile="http://msdn.microsoft.com/rss.xml"</p> <p> XPath="rss/channel/item"</p> <p>/> </p> <p><b>Figure 5:</b> Binding to nodes within an XML document can be done using the new XPath data binding expression. Using this expression causes the XPathBinder class to be invoked. </p> <p>  </p> <p> The <%# XPath(expression) %> syntax invokes a new framework class called XPathBinder that automatically locates the target nodes using the supplied XPath expression and accesses their associated data. Figure 4 demonstrates how to bind the <link> and <title> child elements of each RSS <item> to the DataList s ItemTemplate. Figure 6 shows the output of running this code. </p> <p>  </p> <p><img width="333" height="250" src="/content/legacy/images/asp200604dw_f_image002.jpg" class="old-inline-image"><br><b>Figure 6:</b> The HTML output shown here is generated by binding a DataList to an XmlDataSource control loaded with RSS data. </p> <p>  </p> <p> Filtering out unwanted RSS items can easily be accomplished by changing the XmlDataSource control s XPath property. No additional VB.NET or C# code has to be written. XPath allows where clauses (officially called <i>predicates</i>) to be written so that you can effectively tell the XmlDataSource to Find all <item> nodes where the child <title> node contains the text XML . Predicates are always contained within [ and ] characters in an XPath statement. An example of using an XPath predicate to locate all <item> elements that have XML in the title is shown here: </p> <p>  </p> <p><asp:XmlDataSource ID="RSSDataSource" Runat="server"</p> <p> DataFile="http://msdn.microsoft.com/rss.xml"</p> <p> XPath="rss/channel/item[contains(title,'XML')]"</p> <p> EnableCaching="true"</p> <p> CacheDuration="300"</p> <p> CacheExpirationPolicy="Sliding" </p> <p>/> </p> <p>  </p> <p> In addition to showing how to use an XPath predicate, this example also demonstrates how XML data can be cached by the XmlDataSource control. In this case, the data will be cached for 300 seconds because it s unlikely that the feed will change that frequently. This increases the scalability of the application and makes it load faster for the end user. The XmlDataSource s EnableCaching property is True by default and the CacheDuration property defaults to a value of 0 (infinite cache that only expires when the source file changes). Because this example references an external URL rather than a local file, a specific CacheDuration is listed so that the RSS data is grabbed every 300 seconds. </p> <p>  </p> <h3>Binding the XmlDataSource Control to Server Controls</h3> <p> While XML data can be bound to relational controls such as the DataList, many types of XML documents may need to be shown in a hierarchical manner within an ASP.NET Web Form. Fortunately, ASP.NET 2.0 contains two new server controls named Menu and TreeView that make it easy to show nested XML data to end users while writing little to no VB.NET or C# code. </p> <p>  </p> <p> The TreeView control that ships with .NET version 2 allows hierarchical XML data to be displayed in a standard tree format. A TreeView control consists of multiple TreeNode objects that represent the hierarchical data shown to the end user. TreeNodes can be hard-coded into a TreeView control using a <Nodes> tag, programmatically added, or dynamically created by binding to an XmlDataSource control.</p> <p>  </p> <p> When binding a TreeView to an XmlDataSource control, it s important to identify which nodes in the XML document contain the data used to create TreeNode objects. For example, if you wanted to bind the <link> element s name and href attributes shown in Figure 7, you would need to create data bindings within the TreeView control to let it know which nodes to bind and which nodes to ignore. This type of data binding is done by using a <DataBindings> tag along with one or more <TreeNodeBinding> tags.</p> <p>  </p> <p> Figure 8 shows an example of binding a TreeView to an XmlDataSource control. Notice that it defines two data bindings to the XML document shown in Figure 7. The first binding identifies that the XML document s root element should be bound to the starting node of the TreeView control. This is done by setting the DataMember property of the TreeNodeBinding object to links . The second binding causes the TreeView to bind to all <link> elements in the XML document. This is done by setting the DataMember property to link . The TextField property identifies the name of the XML node that provides the text for each TreeNode object created in the TreeView, while the NavigateUrlField identifies which XML node to use for TreeNode hyperlinks. </p> <p>  </p> <p><links> </p> <p> <link id="1" name="ASP.NET"</p> <p>     href="http://msdn.microsoft.com/asp.net" /> </p> <p> <link id="2" name=".NET Framework"</p> <p>     href="http://msdn.microsoft.com/netframework" /> </p> <p> <link id="3" name="XML"</p> <p>     href="http://msdn.microsoft.com/xml" /> </p> <p> <link id="4" name="Web Services"</p> <p>     href="http://msdn.microsoft.com/webservices" /> </p> <p></links> </p> <p><b>Figure 7:</b> An XML document containing link data. </p> <p>  </p> <p><asp:TreeView ID="TreeView1" Runat="server" ExpandDepth="0"</p> <p> DataSourceID="MenuItemsDataSource"</p> <p> AutoGenerateDataBindings="False"</p> <p> ImageSet="XPFileExplorer"</p> <p> NodeIndent="15"> </p> <p> <DataBindings> </p> <p>    <asp:TreeNodeBinding Text="Links"</p> <p>       DataMember="links" /> </p> <p>    <asp:TreeNodeBinding TextField="name"</p> <p>        DataMember="link"</p> <p>        NavigateUrlField="href" /> </p> <p> </DataBindings> </p> <p> <NodeStyle VerticalPadding="2" </p> <p>   Font-Names="Tahoma" Font-Size="8pt"</p> <p>    HorizontalPadding="2" ForeColor="#000000" /> </p> <p> <HoverNodeStyle Font-Underline="True"</p> <p>    ForeColor="#6666AA" /> </p> <p> <SelectedNodeStyle BackColor="#B5B5B5" /> </p> <p></asp:TreeView> </p> <p><asp:XmlDataSource ID="MenuItemsDataSource" Runat="server"</p> <p>  DataFile="~/XML/Links.xml" </p> <p>  XPath="links" /> </p> <p><b>Figure 8:</b> Identifying XML nodes that should be bound to a TreeView control is accomplished by using TreeNodeBinding tags. </p> <p>  </p> <p> The TreeView control is quite flexible when it comes to changing the look and feel of TreeNode objects. In addition to being able to customize node styles, you can also control the images that appear as the TreeView is rendered. The control ships with several default image sets that define what images are shown next to each TreeNode object. Figure 8 shows an example of different image sets that are defined using the TreeView s ImageSet property. The image sets shown in Figure 9 include XPFileExplorer, Contacts, and BulletedList2. </p> <p>  </p> <p><img width="333" height="282" src="/content/legacy/images/asp200604dw_f_image004.jpg" class="old-inline-image"><br><b>Figure 9:</b> The TreeView control can be customized and themed to make it fit into your ASP.NET 2.0 Web site. The TreeView controls shown here have different values assigned to the ImageSet property. </p> <p>  </p> <h3>Conclusion</h3> <p> Binding different types of XML documents to ASP.NET server controls has been greatly simplified in .NET version 2. With the introduction of the XmlDataSource data source control, XML binding can be done without writing a single line of code. XML data can also be filtered using XPath expressions, which allows fine-grained control over which data shows up in your ASP.NET Web Forms. In a future article I ll introduce additional controls, such as SiteMapDataSource, that can be used to bind XML data to server controls. </p> <p>  </p> <p> If you didn t get a chance to read <a href="/article/aspnetpro/keeping-pace.aspxfeatures/2006/01/asp200601dw_f/asp200601dw_f.asp">Part I</a> or <a href="/article/aspnetpro/keeping-pace.aspxfeatures/2006/03/asp200603dw_f/asp200603dw_f.asp">Part II</a>, or would like to see more information about the topics covered in this article, visit <a href="http://www.xmlforasp.net/">http://www.xmlforasp.net</a> to view online video tutorials that discuss various .NET version 2 XML technologies. </p> <p>  </p> <p> <i>The sample code accompanying this article is available for <a href="/content/legacy/downloads/asp200604dw_f.zip">download</a>. </i></p> <p>  </p> <p><b>Dan Wahlin</b> (Microsoft Most Valuable Professional for ASP.NET and XML Web services) is president of Wahlin Consulting, as well as a .NET instructor at Interface Technical Training. Dan founded the XML for ASP.NET Developers Web site (<a href="http://www.xmlforasp.net/">http://www.XMLforASP.NET</a>), which focuses on using XML, ADO.NET, and Web services in Microsoft s .NET platform. He s also on the INETA Speaker s Bureau and speaks to .NET User Groups around the US. Dan co-authored Professional Windows DNA (Wrox), ASP.NET: Tips, Tutorials, and Code (SAMS), and ASP.NET 1.1 Insider Solutions (SAMS), and authored XML for ASP.NET Developers (SAMS). </p> <p>  </p> <p>  </p> <p>  </p> </div> <div class="secondary-tags"> TAGS: <a href="/software-development" class="secondary-tag">Software Development</a> </div> <div class="comments-wrapper" id="comments-1362"> <div class="comments"> <a href="javascript:void(0)" class="comments--show hidden">0 comments</a> </div> <div class="comments-container"> <div class="fill-comments"> <div class="comments-header"><span class="comments--hide">Hide comments</span></div> <form class="comment-form" action="/comment/reply/1362" method="post" id="comment-form" accept-charset="UTF-8"><div><div class="user-comment-body"> <div class="user-comment-field"> <div class="user-photo"> <img class="user-thumb-img" src="http://www.itprotoday.com/sites/all/themes/penton_core_theme/images/account-default-image.png" alt="" /> </div> <div class="user-content"> <div class="user-name"> <a href="/" class="js-penton-user-url-profile"></a> </div> <div class="user-comment"> <div class="field-type-text-long field-name-comment-body field-widget-text-textarea form-wrapper" id="comment_body"><div id="comment-body-add-more-wrapper"><div class="text-format-wrapper"><div class="form-item form-type-textarea form-item-comment-body-und-0-value"> <label class="element-invisible" for="edit-comment-body-1362">Comment <span class="form-required" title="This field is required.">*</span></label> <div class="form-textarea-wrapper resizable"><textarea class="text-full ckeditor-mod form-textarea required" placeholder="Be the first to comment..." id="edit-comment-body-1362" name="comment_body[und][0][value]" cols="60" rows="5"></textarea></div> </div> <fieldset class="filter-wrapper element-invisible form-wrapper" id="edit-comment-body-und-0-format"><div class="fieldset-wrapper"><div class="filter-help form-wrapper" id="edit-comment-body-und-0-format-help"><p><a href="/filter/tips" target="_blank">More information about text formats</a></p></div><div class="form-item form-type-select form-item-comment-body-und-0-format"> <label for="edit-comment-body-und-0-format--2">Text format </label> <select class="filter-list form-select" id="edit-comment-body-und-0-format--2" name="comment_body[und][0][format]"><option value="comments" selected="selected">Comments</option><option value="plain_text">Plain text</option></select> </div> <div class="filter-guidelines form-wrapper" id="edit-comment-body-und-0-format-guidelines"><div class="filter-guidelines-item filter-guidelines-comments"><h3>Comments</h3><ul class="tips"><li>Allowed HTML tags: <em> <strong> <blockquote> <br> <p></li></ul></div><div class="filter-guidelines-item filter-guidelines-plain_text"><h3>Plain text</h3><ul class="tips"><li>No HTML tags allowed.</li><li>Web page addresses and e-mail addresses turn into links automatically.</li><li>Lines and paragraphs break automatically.</li></ul></div></div></div></fieldset> </div> <a href="#" class="element-invisible publish js-publish user-comment__publishbtn">Publish</a><span class='comment-error'><a href="/penton_modal/nojs/login" class="ctools-use-modal ctools-modal-modal-popup-login" rel="nofollow">Log in or register to comment</a></span></div></div> </div> </div> </div> </div> <input type="hidden" name="cid" value="" /> <input type="hidden" name="pid" value="" /> <input type="hidden" name="form_build_id" value="form-6z8VLjgck-DJPb2N6Suqz6OI4wy95a6iGbyEtw7_Rfs" /> <input type="hidden" name="form_id" value="comment_node_article_form" /> <input type="hidden" name="captcha_sid" value="17618681" /> <input type="hidden" name="captcha_token" value="f4fadb036975130173cf9ee5d07865b9" /> <input class="mollom-content-id" type="hidden" name="mollom[contentId]" value="" /> <input class="mollom-captcha-id" type="hidden" name="mollom[captchaId]" value="" /> <div style="display: none;"><div class="form-item form-type-textfield form-item-mollom-homepage"> <label for="edit-mollom-homepage">Home page </label> <input autocomplete="off" type="text" id="edit-mollom-homepage" name="mollom[homepage]" value="" size="60" maxlength="128" class="form-text" /> </div> </div><div class="element-invisible"><div class="form-actions form-wrapper" id="edit-actions"><button id="edit-submit-1362" name="op" value="Save" class="form-submit">Save</button> </div></div></div></form> <div class="comments-inner-container"> </div> </div> </div> </div> </div> <div class="row related-articles-row"> <div class="related-articles-heading">Related</div><div class="related-articles-wrapper"><a href="/microsoft-visual-studio/microsoft-releases-windows-10-software-development-kit-sdk-preview-build-0" class="small-article-link"><article class="small-article"><div class="img-crop"><img class="js-imgpxr" data-x2src="http://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_retina/public/computer-2557299_640_3.jpg?itok=W_A41Fll" src="http://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_standard/public/computer-2557299_640_3.jpg?itok=9pKymve7" width="90" height="83" alt="Computer and Worker at Desk Hero Image" /></div><div class="small-article__inner"><div class="small-article__inner-title">Microsoft releases Windows 10 Software Development Kit (SDK) Preview Build 17040</div><span>Nov 28, 2017</span></div></article></a><a href="/microsoft-visual-studio/resource-open-extensions-visual-studio" class="small-article-link"><article class="small-article"><div class="img-crop"><img class="js-imgpxr" data-x2src="http://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_retina/public/uploads/2017/07/openinextensionshero_0.png?itok=nNQ8TfPR" src="http://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_standard/public/uploads/2017/07/openinextensionshero_0.png?itok=QjCvJCXT" width="90" height="83" alt="Resource: Open In Extensions for Visual Studio" /></div><div class="small-article__inner"><div class="small-article__inner-title">Resource: Open In Extensions for Visual Studio</div><span>Jul 13, 2017</span></div></article></a><a href="/microsoft-visual-studio/windows-dev-news-mixed-reality-dev-cl-activation-uwp-apps-winrt-components" class="small-article-link"><article class="small-article"><div class="img-crop"><img class="js-imgpxr" data-x2src="http://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_retina/public/uploads/2017/07/computer-1209641640_0.jpg?itok=bl_nAuT_" src="http://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_standard/public/uploads/2017/07/computer-1209641640_0.jpg?itok=hSSZkd_o" width="90" height="83" alt="Windows Dev News: Mixed Reality Dev; CL Activation of UWP Apps; WinRT Components & Desktop Bridge" /></div><div class="small-article__inner"><div class="small-article__inner-title">Windows Dev News: Mixed Reality Dev; CL Activation of UWP Apps; WinRT Components & Desktop Bridge</div><span>Jul 11, 2017</span></div></article></a><a href="/microsoft-visual-studio/windows-app-studio-service-shutting-down-december-1st-2017" class="small-article-link"><article class="small-article"><div class="img-crop"><img class="js-imgpxr" data-x2src="http://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_retina/public/uploads/2017/07/windowsappstudiohero_0.png?itok=JXzEbZkY" src="http://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_standard/public/uploads/2017/07/windowsappstudiohero_0.png?itok=rDdsMu7K" width="90" height="83" alt="Windows App Studio Service is Shutting Down on December 1st, 2017" /></div><div class="small-article__inner"><div class="small-article__inner-title">Windows App Studio Service is Shutting Down on December 1st, 2017</div><span>Jul 06, 2017</span></div></article></a></div> </div> <div class="item-list"><ul class="lazy-pagination"><li class="read-more pagination-read-more next first last"><a href="/microsoft-sharepoint/company-intranets-hold-key-role-many-organizations?parent=1362&infscr=1" rel="nofollow">Load More</a></li> </ul></div> </article> </section> </div> </div> </div> </div> <div class="banner-bottom-wrapper"> <div id="banner-bottom" class="dfp-ad-hideempty hidden"> <div data-dfp-position="bottom_banner"></div> </div> </div> <!-- /Main Content Area --> <!-- Footer --> <!-- Check to see if we are in the store --> <footer class="l-footer l-footer-min "> <div class="l-footer-inner"> <div class="l-footer-info"> <div class="footer-logo-min"> <a href="/"><img class="footer-logo-min__site_logo" src="http://www.itprotoday.com/sites/all/themes/penton_subtheme_itprotoday/images/logos/footer.png" alt="Logo" /></a> <div class="small-12 medium-5 columns"> <div class="footer-links"> <a href="https://informa.com/"><img src="/sites/all/themes/penton_core_theme/images/powered_by_informa_businessline.png" alt="Powered by Informa" /></a> </div> </div> </div> <ul class="footer-min-col"> <li class="footer-min-col__item"> <a href="/about-us" class="footer-min-col-link">About</a> </li> <li class="footer-min-col__item"> <a href="http://www.itprotoday.com/advertise-itpro-today" class="footer-min-col-link">Advertise</a> </li> <li class="footer-min-col__item"> <a href="/contact-us" class="footer-min-col-link">Contact Us</a> </li> <li class="footer-min-col__item"> <a href="/sitemap" class="footer-min-col-link">Sitemap</a> </li> </ul> <ul class="footer-min-col no-margin"> <li class="footer-min-col__item"> <a href="http://engage.informa.com/privacy-statement" class="footer-min-col-link">Privacy Statement</a> </li> <li class="footer-min-col__item"> <a href="http://engage.informa.com/terms-of-service" class="footer-min-col-link">Terms of Service</a> </li> <li class="footer-min-col__item"> <a href="http://www.penton.com/privacy-policy#ThirdPartyAdvertisingTech" class="footer-min-col-link">Ad Choices</a> </li> </ul> <div class="social-min-col"> <p class="social-min-col__label">Follow us:</p> <div class="social-icons"><a href="https://www.facebook.com/ITProToday/" title="" class="social-icons__link"><i class="social-icons__icon fa fa-facebook"></i></a><a href="https://twitter.com/ITProToday" title="" class="social-icons__link"><i class="social-icons__icon fa fa-twitter"></i></a><a href="https://plus.google.com/115563256559407060026 " title="" class="social-icons__link"><i class="social-icons__icon fa fa-google-plus"></i></a><a href="https://www.linkedin.com/groups/1163947" title="" class="social-icons__link"><i class="social-icons__icon fa fa-linkedin"></i></a></div></div> </div> <div class="l-footer-rights"> <span class="copyrights"> © 2018 Informa USA, Inc., All Rights Reserved </span> </div> </div> </footer> <!-- /Footer --> </div> </div> </div> </main> <!-- /Page --> <div id="hidden-dfp" class="dfp-ad-hideempty hidden"> <div data-dfp-position="hidden" class="hidden-for-ads"></div> </div> <script type="text/javascript" src="http://www.itprotoday.com/sites/itprotoday.com/files/js/js_KUtWmy_QP6atnDjXwpDAH183eelDuv-2PY5ksEFKvNQ.js"></script> <script type="text/javascript" src="http://www.googletagservices.com/tag/js/gpt.js"></script> <script type="text/javascript" src="http://www.itprotoday.com/sites/itprotoday.com/files/js/js_8pEoWnUr8ijKw1SExt7kT6gNr85MGL-IZJyQGXvJRP0.js"></script> <script type="text/javascript" src="//assets.adobedtm.com/2ebe67d2ca0193084439038012c34f9112a85c00/satelliteLib-48191dfa1509ee2d203e3f6eb4bc8a3de3320ce9.js"></script> <script type="text/javascript" src="http://www.itprotoday.com/sites/itprotoday.com/files/js/js_eOe-hGqK6-bRjj7DQYO_Y-oCu3MIoF2vYxLUbQbtu4I.js"></script> <script type="text/javascript" src="http://www.itprotoday.com/sites/itprotoday.com/files/js/js_3Uw33PZgsGuP7FMg-z8p_cxrG5AL4S5leWudlYRn04E.js"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- window.CKEDITOR_BASEPATH = "/sites/all/modules/contrib/ckeditor/ckeditor/" //--><!]]> </script> <script type="text/javascript" src="http://www.itprotoday.com/sites/itprotoday.com/files/js/js_FloLC-L2hL--gn7qKaXXBNWxL6qI_-SL4q2_WBFL5X4.js"></script> <script type="text/javascript" src="//video.limelight.com/player/embed.js"></script> <script type="text/javascript" src="https://embed.calculoid.com/scripts/combined.min.js"></script> <script type="text/javascript" src="http://www.itprotoday.com/sites/itprotoday.com/files/js/js_m4Cfw_k95I6kgJagMEdxPTh-eHH8uO3Vg7qfEma7zgI.js"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- Drupal.settings.penton_custom_dfp = {"dfp_tags":{"everywhere":[],"article":{"inarticle1":[{"disabled":false,"api_version":1,"machinename":"article_300_1_rht_infinite","slot":"[article] Rectangle Inline 1","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticle1","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_1_rht"},{"target":"article_number","value":"1"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_1_rht"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"inarticle2":[{"disabled":false,"api_version":1,"machinename":"article_300_2_rht_infinite","slot":"[article] Rectangle Inline 2","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticle2","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_2_rht"},{"target":"article_number","value":"1"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_2_rht"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"inarticle3":[{"disabled":false,"api_version":1,"machinename":"article_300_3_rht_infinite","slot":"[article] Rectangle Inline 3","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticle3","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_3_rht"},{"target":"article_number","value":"1"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_3_rht"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"inarticle4":[{"disabled":false,"api_version":1,"machinename":"article_300_4_rht_infinite","slot":"[article] Rectangle Inline 4","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticle4","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_4_rht"},{"target":"article_number","value":"1"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_4_rht"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"left_rail_rect":[{"disabled":false,"api_version":1,"machinename":"article_300_x_lft","slot":"[article] Left rail 300_x_lft","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[300,250],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"left_rail_rect","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_1_lft"}],"breakpoints":[{"browser_size":"779x0","ad_sizes":"300x250"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_1_lft"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"jumbotron":[{"disabled":false,"api_version":1,"machinename":"article_300_x_rht","slot":"[article] Rectangle Inline and Jumbotron","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"jumbotron","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_1_rht"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_1_rht"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"top_banner":[{"disabled":false,"api_version":1,"machinename":"article_728_1_a","slot":"[article] Leaderboard 728_1_a","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[[728,90],[970,90],[320,50]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"top_banner","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"728_1_a"},{"target":"program","value":"[node:program_without_space_specialchars]"},{"target":"ptype","value":"[node:field_penton_article_type]"},{"target":"nid","value":"[node:nid]"},{"target":"pterm","value":"[node:pterm_without_space_specialchars]"},{"target":"sterm","value":"[node:sterm_without_space_specialchars]"},{"target":"author","value":"[node:author_without_space_specialchars]"},{"target":"combo","value":"wrap"},{"target":"content","value":"[node:program_without_space_specialchars]"}],"breakpoints":[{"browser_size":"1119x0","ad_sizes":"970x90,728x90"},{"browser_size":"728x0","ad_sizes":"728x90"},{"browser_size":"0x0","ad_sizes":"320x50"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[[970,90],[728,90]],"browser_size":[1119,0]},{"ad_sizes":[728,90],"browser_size":[728,0]},{"ad_sizes":[320,50],"browser_size":[0,0]}],"targeting":[{"target":"pos","value":"728_1_a"},{"target":"combo","value":"wrap"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"bottom_banner":[{"disabled":false,"api_version":1,"machinename":"article_728_footer","slot":"[article] Leaderboard 728_10_a","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[[728,90],[320,50]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"bottom_banner","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"728_10_a"}],"breakpoints":[{"browser_size":"1119x0","ad_sizes":"728x90"},{"browser_size":"728x0","ad_sizes":"728x90"},{"browser_size":"0x0","ad_sizes":"320x50"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[728,90],"browser_size":[1119,0]},{"ad_sizes":[728,90],"browser_size":[728,0]},{"ad_sizes":[320,50],"browser_size":[0,0]}],"targeting":[{"target":"pos","value":"728_10_a"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"hidden":[{"disabled":false,"api_version":1,"machinename":"article_canopy","slot":"[article] Canopy","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[1,1],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"hidden","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"adhesion"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"adhesion"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]},{"disabled":false,"api_version":1,"machinename":"article_footnote_floor","slot":"[article] Footnote_Floor","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[1,1],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"hidden","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"footnote"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"footnote"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]},{"disabled":false,"api_version":1,"machinename":"article_oop","slot":"[article] Out of Page","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[0,0],"block":0,"settings":{"out_of_page":1,"slug":"","short_tag":0,"location":"article","position":"hidden","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"oop_a"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"oop_a"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]},{"disabled":false,"api_version":1,"machinename":"article_pagewrap","slot":"[article] PageWrap","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[1,1],"block":0,"settings":{"out_of_page":1,"slug":"","short_tag":0,"location":"article","position":"hidden","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"wrap"},{"target":"combo","value":"wrap"}],"breakpoints":[{"browser_size":"1500x0","ad_sizes":"1x1"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[1,1],"browser_size":[1500,0]}],"targeting":[{"target":"pos","value":"wrap"},{"target":"combo","value":"wrap"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"custom_content_channel_sponsored_header":[{"disabled":false,"api_version":1,"machinename":"article_ccc_header","slot":"[article] Article CCC header","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[[160,65],[125,125],[90,90]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"custom_content_channel_sponsored_header","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"customsponsoredlogo1"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"customsponsoredlogo1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"custom_content_channel_sponsored_resources":[{"disabled":false,"api_version":1,"machinename":"article_ccc_resources","slot":"[article] Article CCC resources","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[[160,65],[125,125],[90,90]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"custom_content_channel_sponsored_resources","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"customsponsoredlogo2"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"customsponsoredlogo2"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"inarticlevid":[{"disabled":false,"api_version":1,"machinename":"article_in_article_video_ad","slot":"[article] In-Article Video Ad","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[1,1],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticlevid","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"inarticlevideo_1_a"},{"target":"article_number","value":"1"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"inarticlevideo_1_a"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"infinitescroll":[{"disabled":false,"api_version":1,"machinename":"article_interscroller_728_x_a","slot":"[article] Interscroller\/Leaderboard 2","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[[728,90],[320,50]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"infinitescroll","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"728_2_a"}],"breakpoints":[{"browser_size":"1119x0","ad_sizes":"728x90"},{"browser_size":"728x0","ad_sizes":"728x90"},{"browser_size":"0x0","ad_sizes":"320x50"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[728,90],"browser_size":[1119,0]},{"ad_sizes":[728,90],"browser_size":[728,0]},{"ad_sizes":[320,50],"browser_size":[0,0]}],"targeting":[{"target":"pos","value":"728_2_a"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"sponsored_logo":[{"disabled":false,"api_version":1,"machinename":"article_sponsored_logo","slot":"[article] Sponsored Logo","adunit":"\/3834\/itprotoday.home\/article\/software_development\/microsoft_visual_studio","size":[[160,65],[125,125],[90,90]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"sponsored_logo","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"sponsoredlogo"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"sponsoredlogo"},{"target":"ptype","value":"Article"},{"target":"nid","value":"1362"},{"target":"pterm","value":"microsoft_visual_studio"},{"target":"sterm","value":"software_development"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}]}},"current_type":"article","default_adunit":"\/3834\/itprotoday.home","async_rendering":1,"single_request":0,"collapse_empty_divs":"1","viewport":1,"lifetime_banner":"2000","do_byline":0,"enable_sticky":1,"enable_cb_refresh":1,"cb_refresh_interval":"15","is_blocked_ip":false,"uip":"50.19.34.255"}; //--><!]]> </script> <script type="text/javascript" src="http://www.itprotoday.com/sites/itprotoday.com/files/js/js_m0Qm7ZLBa0Us5bK_pvZ1T3hMtRZOtWiklopETCWH6Qk.js"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- Drupal.settings.penton_eloqua_api = {"fields":["nl","utm_rid"]}; //--><!]]> </script> <script type="text/javascript" src="http://www.itprotoday.com/sites/itprotoday.com/files/js/js_EtdtXxRiphKw3AU6vL8cSYAizvnfl78aifsOby2rJ0U.js"></script> <script type="text/javascript" src="http://www.itprotoday.com/sites/itprotoday.com/files/js/js_8uA0fZVWd2NTThW2fR8a1EtLA2Y8Q1Rspbb-rLZHmE4.js"></script> <script type="text/javascript" src="http://www.itprotoday.com/sites/itprotoday.com/files/js/js_KIwLxGMqoJtHLuCU1tBsjwRtZcXqJAAPjkc5R7V3izE.js"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- jQuery.extend(Drupal.settings, {"basePath":"\/","pathPrefix":"","ajaxPageState":{"theme":"penton_subtheme_itprotoday","theme_token":"QaXHZVT0SERzROmKMwn8iGsySHSujyl-e7ujBDvmrWM","jquery_version":"1.10","js":{"sites\/all\/modules\/contrib\/ckeditor\/includes\/ckeditor.utils.js":1,"sites\/all\/modules\/contrib\/ckeditor\/ckeditor\/ckeditor.js":1,"sites\/all\/modules\/custom\/penton_adobe_dtm\/js\/penton_adobe_dtm.js":1,"sites\/all\/modules\/contrib\/jquery_update\/replace\/jquery\/1.10\/jquery.min.js":1,"misc\/jquery.once.js":1,"http:\/\/www.googletagservices.com\/tag\/js\/gpt.js":1,"misc\/drupal.js":1,"\/\/assets.adobedtm.com\/2ebe67d2ca0193084439038012c34f9112a85c00\/satelliteLib-48191dfa1509ee2d203e3f6eb4bc8a3de3320ce9.js":1,"sites\/all\/modules\/contrib\/jquery_update\/replace\/ui\/ui\/minified\/jquery.ui.core.min.js":1,"sites\/all\/modules\/contrib\/jquery_update\/replace\/ui\/external\/jquery.cookie.js":1,"sites\/all\/modules\/contrib\/jquery_update\/replace\/jquery.form\/4\/jquery.form.min.js":1,"misc\/form.js":1,"misc\/ajax.js":1,"sites\/all\/modules\/contrib\/jquery_update\/js\/jquery_update.js":1,"sites\/all\/modules\/custom\/penton_modal\/js\/penton_modal_user_registration.js":1,"sites\/all\/modules\/custom\/penton_user_register\/js\/penton_user_register.js":1,"sites\/all\/modules\/contrib\/ubercart\/uc_file\/uc_file.js":1,"0":1,"sites\/all\/modules\/custom\/penton_modal\/js\/penton_modal_popup.js":1,"\/\/video.limelight.com\/player\/embed.js":1,"https:\/\/embed.calculoid.com\/scripts\/combined.min.js":1,"sites\/all\/modules\/contrib\/authcache\/authcache.js":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/data-render.js":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/viewport.js":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/dfp.dom.js":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/dfp.iframe.js":1,"1":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/dfp.sticky.js":1,"sites\/all\/modules\/custom\/penton_eloqua_api\/js\/eloqua_tracking.js":1,"2":1,"sites\/all\/modules\/custom\/penton_eloqua_api\/js\/cookies.helper.js":1,"misc\/progress.js":1,"sites\/all\/modules\/contrib\/ctools\/js\/modal.js":1,"sites\/all\/modules\/custom\/penton_social\/js\/penton_social.js":1,"sites\/all\/modules\/contrib\/prevent_js_alerts\/prevent_js_alerts.js":1,"sites\/all\/modules\/contrib\/captcha\/captcha.js":1,"sites\/all\/modules\/custom\/penton_comment\/scripts\/comments.js":1,"sites\/all\/modules\/contrib\/service_links\/js\/pinterest_button.js":1,"misc\/textarea.js":1,"modules\/filter\/filter.js":1,"sites\/all\/modules\/contrib\/mollom\/mollom.js":1,"sites\/all\/themes\/penton_core_theme\/public\/scripts.js":1,"sites\/all\/themes\/penton_core_theme\/public\/vendor.js":1,"sites\/all\/modules\/custom\/penton_legal_comm\/js\/client.js":1,"sites\/all\/modules\/custom\/penton_legal_comm\/js\/alert.js":1},"css":{"modules\/system\/system.base.css":1,"modules\/system\/system.menus.css":1,"modules\/system\/system.messages.css":1,"modules\/system\/system.theme.css":1,"misc\/ui\/jquery.ui.core.css":1,"misc\/ui\/jquery.ui.theme.css":1,"modules\/book\/book.css":1,"modules\/comment\/comment.css":1,"sites\/all\/modules\/contrib\/date\/date_api\/date.css":1,"modules\/field\/theme\/field.css":1,"sites\/all\/modules\/contrib\/logintoboggan\/logintoboggan.css":1,"sites\/all\/modules\/contrib\/mollom\/mollom.css":1,"modules\/node\/node.css":1,"modules\/search\/search.css":1,"sites\/all\/modules\/contrib\/ubercart\/uc_file\/uc_file.css":1,"sites\/all\/modules\/contrib\/ubercart\/uc_order\/uc_order.css":1,"sites\/all\/modules\/contrib\/ubercart\/uc_product\/uc_product.css":1,"sites\/all\/modules\/contrib\/ubercart\/uc_store\/uc_store.css":1,"modules\/user\/user.css":1,"sites\/all\/modules\/contrib\/views\/css\/views.css":1,"sites\/all\/modules\/contrib\/ckeditor\/css\/ckeditor.css":1,"sites\/all\/modules\/features\/penton_people_search\/penton_people_search.css":1,"sites\/all\/modules\/contrib\/ctools\/css\/ctools.css":1,"sites\/all\/modules\/contrib\/ctools\/css\/modal.css":1,"sites\/all\/modules\/contrib\/forward\/forward.css":1,"sites\/all\/modules\/contrib\/print\/print_ui\/css\/print_ui.theme.css":1,"sites\/all\/modules\/contrib\/ckeditor\/css\/ckeditor.editor.css":1,"modules\/filter\/filter.css":1,"sites\/all\/themes\/penton_subtheme_itprotoday\/public\/style.css":1,"sites\/all\/themes\/penton_core_theme\/public\/vendor.css":1,"sites\/all\/themes\/penton_core_theme\/public\/override\/system.messages.css":1,"sites\/all\/themes\/penton_core_theme\/public\/override\/system.base.css":1,"sites\/all\/themes\/penton_core_theme\/public\/override\/system.menus.css":1,"sites\/all\/themes\/penton_core_theme\/public\/override\/user.css":1,"sites\/all\/themes\/penton_core_theme\/public\/style.ie9.css":1,"https:\/\/embed.calculoid.com\/styles\/main.css":1}},"authcache":{"q":"node\/1362","cp":{"path":"\/","domain":".www.itprotoday.com","secure":false},"cl":390},"typekitId":"njq2hxj","adunit":"\/3834\/itprotoday.home","polar_property_id":"NA-ITPRCOM-11238907","is_new_welcome_ad":1,"penton_eloqua_api":{"eloqua_site_id":null,"tracking_enabled":null},"CToolsModal":{"loadingText":"Loading...","closeText":"Close Window","closeImage":"\u003Cimg src=\u0022http:\/\/www.itprotoday.com\/sites\/all\/modules\/contrib\/ctools\/images\/icon-close-window.png\u0022 alt=\u0022Close window\u0022 title=\u0022Close window\u0022 \/\u003E","throbber":"\u003Cimg src=\u0022http:\/\/www.itprotoday.com\/sites\/all\/modules\/contrib\/ctools\/images\/throbber.gif\u0022 alt=\u0022Loading\u0022 title=\u0022Loading...\u0022 \/\u003E"},"modal-popup-small":{"modalSize":{"type":"fixed","width":300,"height":300},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopup"},"modal-popup-medium":{"modalSize":{"type":"fixed","width":550,"height":450},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopup"},"modal-popup-large":{"modalSize":{"type":"scale","width":0.8,"height":0.8},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopup"},"modal-popup-x-large":{"modalSize":{"type":"scale","width":1100,"height":850},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupXLarge"},"modal-popup-basic":{"modalSize":{"type":"fixed","width":550,"height":450},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupBasic"},"modal-popup-basic-email":{"modalSize":{"type":"fixed","width":550,"height":450},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupBasicEmail"},"modal-popup-advanced":{"modalSize":{"type":"fixed","width":550,"height":450},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupAdvanced"},"modal-popup-login":{"modalSize":{"type":"fixed","width":545,"height":485},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupLogin"},"modal-popup-legal-comm":{"modalSize":{"type":"fixed","width":300,"height":300},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","closeText":"Close","modalTheme":"PentonModalPopupLegalComm"},"modal-popup-validation-prompt":{"modalSize":{"type":"fixed","width":300,"height":300},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","closeText":"Close","modalTheme":"PentonModalPopupValidationPrompt"},"prevent_js_alerts":{"module_path":"sites\/all\/modules\/contrib\/prevent_js_alerts"},"ws_pb":{"countlayout":"horizontal"},"penton_adobe_dtm":{"user":{"profile":{"profileInfo":{"profileID":"null"}},"segment":{"loginStatus":"unreg","permission":"anonymous"}},"page":{"pageInfo":{"pageName":"New XML Features in .NET Version 2: Part III","pageID":"059d2ba9-e5d4-41c2-93e8-a19e107d8085","author":"Dan Wahlin","issueDate":"Oct 30, 2009"},"destinationURL":"http:\/\/www.itprotoday.com\/microsoft-visual-studio\/new-xml-features-net-version-2-part-iii","category":{"pageType":"article","primaryCategory":"Software Development \u003E Microsoft Visual Studio"},"attributes":{"taxonomy":"Microsoft Visual Studio|Software Development","permission":"public","subType1":"Article","subType2":"","visibility":"visible","programs":"","scrollCount":"10","scrollPosition":"1_of_10","countsTowardGoal":""}}},"penton_adobe_dtm_events":[],"ckeditor":{"input_formats":{"comments":{"customConfig":"\/sites\/all\/modules\/contrib\/ckeditor\/ckeditor.config.js?","defaultLanguage":"en","toolbar":"[\n [\u0027Bold\u0027,\u0027Italic\u0027,\u0027Blockquote\u0027]\n]","enterMode":1,"shiftEnterMode":2,"toolbarStartupExpanded":true,"width":"100%","skin":"bootstrapck","format_tags":"p;div;pre;address;h1;h2;h3;h4;h5;h6","show_toggle":"f","default":"f","ss":2,"loadPlugins":[],"entities":false,"entities_greek":false,"entities_latin":false,"scayt_autoStartup":false,"language":"en","scayt_sLang":"en_US","js_conf":{"extraPlugins":"\u0027autogrow\u0027","autoGrow_minHeight":"100","autoGrow_maxHeight":"600","fullPage":true},"stylesCombo_stylesSet":"drupal:\/sites\/all\/modules\/contrib\/ckeditor\/ckeditor.styles.js","contentsCss":["\/sites\/all\/themes\/penton_subtheme_itprotoday\/public\/style.css?p49c4a","\/sites\/all\/themes\/penton_core_theme\/public\/vendor.css?p49c4a","\/sites\/all\/themes\/penton_core_theme\/public\/override\/system.messages.css?p49c4a","\/sites\/all\/themes\/penton_core_theme\/public\/override\/system.base.css?p49c4a","\/sites\/all\/themes\/penton_core_theme\/public\/override\/system.menus.css?p49c4a","\/sites\/all\/themes\/penton_core_theme\/public\/override\/user.css?p49c4a","\/sites\/all\/modules\/contrib\/ckeditor\/css\/ckeditor.css?p49c4a","\/sites\/all\/modules\/contrib\/ckeditor\/css\/ckeditor.css?p49c4a"]}},"plugins":[],"textarea_default_format":{"edit-comment-body-1362":"comments"},"module_path":"\/sites\/all\/modules\/contrib\/ckeditor","editor_path":"\/sites\/all\/modules\/contrib\/ckeditor\/ckeditor\/","ajaxToken":"RsGWsxOx5Rx10YYMz7x-IpP06wFpWlycYTYgMrfrQ-8","xss_url":"\/ckeditor\/xss","theme":"penton_subtheme_itprotoday","elements":{"edit-comment-body-1362":"comments"},"scayt_language":"en_US"},"ajax":{"edit-submit-1362":{"callback":"penton_comment_comment_add","event":"mousedown","keypress":true,"prevent":"click","url":"\/system\/ajax","submit":{"_triggering_element_name":"op","_triggering_element_value":"Save"}}},"urlIsAjaxTrusted":{"\/system\/ajax":true,"\/comment\/reply\/1362":true}}); //--><!]]> </script> <script type="text/javascript" src="http://www.itprotoday.com/sites/itprotoday.com/files/js/js_yBfMcJqDRqllnqGw9cUCSpLi8jJ_zCvz8eaES44X4xo.js"></script> <script type="text/javascript" src="http://www.itprotoday.com/sites/all/modules/contrib/ckeditor/ckeditor/ckeditor.js?p49c4a"></script> <script type="text/javascript" src="http://www.itprotoday.com/sites/itprotoday.com/files/js/js_hTvEvnr-CSP0ayePYXq_lDVR4Xlir2rUBDh7jP_21fI.js"></script> </div> </body> </html>