New XML Features in .NET Version 2: Part I

The XmlReader and XmlWriter Classes

CoverStory

LANGUAGES: C#

ASP.NET VERSIONS: 2.0

 

New XML Features in .NET Version 2: Part I

The XmlReader and XmlWriter Classes

 

By Dan Wahlin

 

It s fascinating how fast XML technologies have advanced since the initial release of the XML 1.0 specification in 1998. Prior to XML, flat-files were the norm (actually, they still are in many of today s industries ... but I digress), which meant that developers had to write custom parsing, validation, and transformation mechanisms to work with data. XML introduced the concept of describing data through simple begin and end tags and brought several other vital components to the table, including parsers and validators. With the release of the XSLT 1.0 specification in 1999, XML data could even be transformed to a variety of formats quickly and easily with a minimal amount of programming code.

 

Version 1.1 of the .NET Framework provided excellent support for a variety of mainstream XML technologies, including DTDs, XML Schemas, XSLT 1.0, XPath 1.0, SOAP 1.1, DOM Level 2, and XML namespaces. All of this functionality was available out of the box; that is, without having to install additional add-ons. The release of .NET version 2 continues the tradition of excellent support for XML technologies. In fact, just to name a few of the enhancements, this new release adds significantly more performant XSLT transformation capabilities and enhanced XmlReader and XmlWriter APIs plus a more powerful XPathNavigator class.

 

In this article series I ll discuss some of the new XML features found in .NET version 2, and demonstrate how they can be used to work with XML data in a variety of ways. In Part I I ll focus on the XmlReader and XmlWriter classes; in Part II I ll examine new enhancements to the XmlDocument and XPathNavigator classes and take a look at new classes, such as XslCompiledTransform and XmlDataSource.

 

What s New with XmlReader?

The .NET Framework offers several different classes within the System.Xml namespace (and associated sub namespaces) for parsing XML data, including XmlReader, XmlDocument, XPathNavigator, and XmlSerializer. The fastest, most scalable and memory efficient API for parsing XML data is found in the XmlReader class. XmlReader provides a forward-only parsing API that allows large amounts of XML data to be parsed quickly. Version 2 s XmlReader boasts up to a 100% increase in performance as compared to version 1.1.

 

Version 2 of .NET introduces a new API for creating and using an XmlReader object. Previously, in version 1.1, developers would write code similar to the following example to parse XML data and locate an element named

:

 

XmlTextReader reader = new XmlTextReader(xmlFilePath);

while (reader.Read()) {

 if (reader.Name == "Address") {

   string city = reader.GetAttribute("City");

 }

}

reader.Close();

 

In version 2, the XmlTextReader class has been marked obsolete and the abstract XmlReader class has been enhanced significantly. Although you still can t create an instance of an XmlReader directly using the new keyword, you can call its new Create method:

 

XmlReader reader = XmlReader.Create(xmlFilePath);

while (reader.Read()) {

 //Parse XML data

}

reader.Close();

 

The Create method returns an XmlReader instance that can be used much like the XmlTextReader class in version 1.1. However, the XmlReader class found in .NET version 2 contains an abundance of new methods that make it easier to locate data within an XML document and convert it to various data types. Some of my favorite new methods include ReadToDescendant, ReadToNextSibling, and ReadSubTree, as well as other methods, such as ReadContentAsDateTime, which allows XML data to automatically be converted to CLR data types without writing casting code.

 

ReadToDescendant provides a simple way to locate a specific child node within an XML document. For example, if one or more elements named

exist within a document, ReadToDescendant can be used to move to the first
element:

 

//using keyword automatically closes the XmlReader in C#

using (XmlReader reader = XmlReader.Create(xmlFilePath)) {

 //Move to first

element

 reader.MoveToDescendant("Address");

}

 

ReadToNextSibling can be used to move from a node on which an XmlReader is currently positioned (such as

) to the next sibling in the document:

 

using (XmlReader reader = XmlReader.Create(xmlFilePath)) {

 //Move to first

element and then loop

 //through all siblings

 reader.MoveToDescendant("Address");

 do {

     string city = reader.GetAttribute("City");

     //Access other

element data

 while (reader.MoveToNextSibling());

}

 

New methods aren t the only enhancements that have been added to the XmlReader class. It s also capable of performing validation in version 2. In version 1.1, an XmlValidatingReader had to be instantiated to validate XML against a DTD or XSD schema. In version 2, however, XmlReader can be used to parse and validate data. Validation is turned on by using XmlReaderSettings, a new class available in the framework.

 

XmlReaderSettings allows a variety of features to be set as a reader parses XML data. For example, white space, comments, and processing instructions can be ignored by setting to true the XmlReaderSettings IgnoreWhiteSpace, IgnoreComments, and IgnoreProcessingInstructions properties. By setting the CheckCharacters property to true, Character checking can be performed to ensure that only legal XML characters are used in the document. Validation can be performed by adding one or more schemas to the XmlReaderSettings Schemas collection and by setting the ValidationType property to ValidationType.Schema.

 

Once properties have been set on an XmlReaderSettings object it can be passed to the XmlReader s Create method. Figure 1 shows an example of using the XmlReaderSettings class, along with the XmlReader class, to validate an XML document against an XSD schema.

 

private bool status

public void btnSubmit_Click(object sender, EventArgs e) {

 string xmlPath = Server.MapPath("~/XML/MSDN.xml");

 string schemaPath = Server.MapPath("~/Schemas/MSDN.xsd");

 //Load schema used to validate

 XmlSchemaSet schemaSet = new XmlSchemaSet();

 schemaSet.Add(String.Empty, schemaPath);

 schemaSet.Compile();

 //Define XmlReader settings

 XmlReaderSettings readerSettings = new XmlReaderSettings();

 readerSettings.ValidationType = ValidationType.Schema;

 readerSettings.Schemas = schemaSet;

 //Hook up event handler to handle any validation errors

 readerSettings.ValidationEventHandler +=

   new ValidationEventHandler(ValidationEventHandler);

 //Create XmlReader instance and pass in XmlReaderSettings

 using (XmlReader reader =

   XmlReader.Create(xmlPath, readerSettings)) {

     while (reader.Read()) { }

 }

 this.lblOutput.Text =

(status) ? "Validation Succeeded!" : "Validation Failed!";

}

private void ValidationEventHandler(object sender,

 ValidationEventArgs e) {

  status = false;

}

Figure 1: The XmlReaderSettings class allows various XmlReader features to be turned on or off easily. This example demonstrates how to validate an XML document against an XSD schema that is loaded into the new XmlSchemaSet class.

 

What s New with XmlWriter?

The XmlReader class provides an efficient way to parse XML documents, but it can t be used to generate XML data. That s where .NET s XmlWriter class comes into play. XmlWriter allows XML data to be written to a variety of output sources, including Streams, TextWriters, files, and other XmlWriters.

 

Although the XmlWriter API hasn t changed as substantially as the XmlReader API in version 2, there are several changes that you can leverage to generate dynamic RSS feeds or other custom XML documents. One of the most important changes is in the way it is instantiated. In version 1.1, the following code would typically be written to generate XML:

 

XmlTextWriter writer = new XmlTextWriter(

 filePath,Encoding.UTF8);

writer.WriteStartElement("golfers");

 writer.WriteStartElement("golfer");

     writer.WriteAttributeString("name","Mike");

     writer.WriteAttributeString("handicap","14");

 writer.WriteEndElement();

writer.WriteEndElement();

writer.Close();

 

Version 1.1 contained an XmlWriter class, but it couldn t be instantiated using the new keyword because it was abstract. In version 2, the XmlWriter class is still abstract, but it now exposes a Create method that accepts a variety of parameters that control where the XML output goes:

 

//using keyword automatically closes the XmlWriter in C#

using (XmlWriter writer = XmlWriter.Create(path)) {

 writer.WriteStartElement("golfers");

     writer.WriteStartElement("golfer");

         writer.WriteAttributeString("name","Simon");

         writer.WriteAttributeString("handicap","2");

     writer.WriteEndElement();

 writer.WriteEndElement();

}

 

The XmlWriter s Create method can also accept an instance of a new class named XmlWriterSettings that can be used to apply indentation to XML output or cause attributes to be placed on separate lines. It can also be used to control the output encoding or prevent the XML declaration from being written out. Figure 2 demonstrates how the XmlWriterSettings class can be used. The output is shown in Figure 3.

 

XmlWriterSettings ws = new XmlWriterSettings();

ws.Indent = true;

ws.CheckCharacters = true;

ws.NewLineOnAttributes = true;

StringWriter sw = new StringWriter();

using (XmlWriter writer = XmlWriter.Create(sw, ws)) {

 writer.WriteStartElement("customers");

 writer.WriteStartElement("customer");

 writer.WriteAttributeString(

  "id", Guid.NewGuid().ToString());

 writer.WriteAttributeString("fname", "John");

 writer.WriteAttributeString("lname", "Doe");

 writer.WriteEndElement();

 writer.WriteStartElement("customer");

 writer.WriteAttributeString(

  "id", Guid.NewGuid().ToString());

 writer.WriteAttributeString("fname", "Jane");

 writer.WriteAttributeString("lname", "Doe");

 writer.WriteEndElement();

 writer.WriteEndElement(); //close customers

}

this.txtXml.Text = sw.GetStringBuilder().ToString();

Figure 2: The XmlWriterSettings class can be used to control several different features of XmlWriter. The code shown here uses XmlWriterSettings to ensure that valid XML characters are used, indentation is applied, and attributes are placed on their own line in the output.

 

 

  id="83ef3265-e94d-4587-ac00-faaee5ca4f03"

  fname="John"

  lname="Doe" />

 

  id="74be7621-632d-4f54-be1d-9f77a3ddf83b"

  fname="Jane"

  lname="Doe" />

Figure 3: XML output generated from running the code shown in Figure 2. Notice that each attribute is placed on its own line because the XmlWriterSettings NewLineOnAttributes property was set to true.

 

Displaying RSS Feeds with XmlReader and XmlWriter

Now that you ve seen a few of the new features associated with the XmlReader and XmlWriter classes in .NET version 2, let s finish up with an example of using these classes together to parse and display data from an RSS feed. Although several different options exist for parsing RSS feeds in the .NET Framework (XmlDataSource, DataSet, XPathNavigator, and others I ll discuss in Part II of this series), using the XmlReader and XmlWriter classes together provides a highly efficient and scalable solution because both work with streams of data.

 

To display an RSS feed, the XML data must first be parsed; the XmlReader class performs this job quite well. Each element within the RSS feed must be located so that the item s and <link> child element data can be captured. As each item is parsed, XmlWriter can be used to generate HTML output directly to the Response stream or the output can be captured in an object such as the StringWriter so that the data can be written to a Label control. Figure 4 shows how to combine the XmlReader and XmlWriter classes together to parse and display RSS data from the MSDN Web site. Figure 5 shows the output generated by the XmlWriter class. </p> <p>  </p> <p>public partial class ParsingRss : System.Web.UI.Page {</p> <p> protected void Page_Load(object sender, EventArgs e) {</p> <p>   StringWriter sw = new StringWriter();</p> <p>   XmlWriterSettings ws = new XmlWriterSettings();</p> <p>   ws.Indent = true; </p> <p>   ws.OmitXmlDeclaration = true; </p> <p>   using (XmlWriter writer = XmlWriter.Create(sw, ws)) {</p> <p>     writer.WriteStartElement("ul"); </p> <p>     string xmlPath = Server.MapPath("~/XML/MSDN.xml"); </p> <p>     using (XmlReader reader =</p> <p>            XmlReader.Create(xmlPath)) {</p> <p>         reader.ReadToDescendant("item"); </p> <p>         //Read each <item> node in the RSS document</p> <p>         do {</p> <p>             ReadSubTree(reader.ReadSubtree(), writer); </p> <p>         } while (reader.ReadToNextSibling("item")); </p> <p>     } </p> <p>     writer.WriteEndElement();</p> <p>   } </p> <p>   this.lblOutput.Text = sw.ToString();</p> <p> } </p> <p> //Read child nodes of <item> in RSS document</p> <p> private void ReadSubTree(XmlReader subReader, </p> <p>                          XmlWriter writer) {</p> <p>   subReader.Read();</p> <p>   string link = null; </p> <p>   string title = null; </p> <p>   while (subReader.Read()) {</p> <p>     if (subReader.Name == "title") {</p> <p>         title = subReader.ReadElementString();</p> <p>     } </p> <p>     if (subReader.Name == "link") {</p> <p>         link = subReader.ReadElementString();</p> <p>     } </p> <p>   } </p> <p>   //Write out title and link node values to XmlWriter</p> <p>   writer.WriteStartElement("li"); </p> <p>     writer.WriteStartElement("a"); </p> <p>         writer.WriteAttributeString("href", link); </p> <p>         writer.WriteString(title); </p> <p>     writer.WriteEndElement(); //close <a> </p> <p>   writer.WriteEndElement(); //close <li> </p> <p>   subReader.Close();</p> <p> } </p> <p>}</p> <p><b>Figure 4:</b> Parsing RSS feeds using the XmlReader and XmlWriter classes provides a highly scalable solution that minimizes memory consumption. </p> <p>  </p> <p><img width="333" height="264" src="/content/legacy/images/asp200601dw_f_image002.jpg" class="old-inline-image"><br><b>Figure 5:</b> The output generated by using the XmlReader and XmlWriter classes to parse and display an RSS document. </p> <p>  </p> <h3>Conclusion</h3> <p> Version 2 of the .NET Framework offers many new features that simplify working with XML data. In this article you ve seen some of the new features associated with the XmlReader and XmlWriter classes, as well as their helper classes. These classes provide the most efficient APIs available in the framework to parse and create XML data.</p> <p>  </p> <p> In <a href="/article/aspnetpro/keeping-pace.aspxfeatures/2006/03/asp200603dw_f/asp200603dw_f.asp">Part II</a> of this article series I ll cover additional XML functionality built into .NET version 2, and demonstrate how, in some cases, you can consume and display XML data without writing a single line of C# or VB.NET code!</p> <p>  </p> <p> <i>The sample code accompanying this article is available for <a href="/content/legacy/downloads/asp200601dw_f.zip">download</a>. </i></p> <p>  </p> <p><b>Dan Wahlin</b> (Microsoft MVP for ASP.NET and XML Web services) is the president of Wahlin Consulting and 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 a corporate trainer and speaker, and teaches XML and .NET training courses around the US. Dan coauthored Professional Windows DNA (Wrox), ASP.NET: Tips, Tutorials and Code (SAMS), and ASP.NET 1.1 Insider Solutions, 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-2429"> <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/2429" 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-2429">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-2429" 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-TI7bFxJJ9TV-_LZctfrFtbY7y2L8WMzFgTEGVvCJ8uo" /> <input type="hidden" name="form_id" value="comment_node_article_form" /> <input type="hidden" name="captcha_sid" value="17659954" /> <input type="hidden" name="captcha_token" value="453e14db6700efa03bb02d16b0d58a28" /> <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-2429" 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="/endpoint-security/marketing-cloud-services-what-agencies-need-know-about-security?parent=2429&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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"2429"},{"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":"54.227.48.147"}; //--><!]]> </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":"qI2OI7BZKscXyKcKMSsnuS5N4BszVrKFUQtp7TTc8HU","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\/2429","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 I","pageID":"336d338c-1a33-4e9c-9312-7f1434723814","author":"Dan Wahlin","issueDate":"Oct 30, 2009"},"destinationURL":"http:\/\/www.itprotoday.com\/microsoft-visual-studio\/new-xml-features-net-version-2-part-i","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-2429":"comments"},"module_path":"\/sites\/all\/modules\/contrib\/ckeditor","editor_path":"\/sites\/all\/modules\/contrib\/ckeditor\/ckeditor\/","ajaxToken":"9-am-EokbuzN95O4VtTBoYMwVESEu7LaVScrFEIU5Cs","xss_url":"\/ckeditor\/xss","theme":"penton_subtheme_itprotoday","elements":{"edit-comment-body-2429":"comments"},"scayt_language":"en_US"},"ajax":{"edit-submit-2429":{"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\/2429":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>