Skip navigation

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="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="https://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> <a class="ckeditor_links" style="display:none" href="javascript:void(0);" onclick="javascript:Drupal.ckeditorToggle(['edit-comment-body-2429'],'Switch to plain text editor','Switch to rich text editor');" id="switch_edit-comment-body-2429">Switch to plain text editor</a><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="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-a4uA1yeeJn-_hksP1echV7bdACqG1uJjXchQallPaKo" /> <input type="hidden" name="form_id" value="comment_node_article_form" /> <input type="hidden" name="captcha_sid" value="162535370" /> <input type="hidden" name="captcha_token" value="ea2a2d2c39ea0003a57428d422a15bfc" /> <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 class="url-textfield"><div class="form-item form-type-textfield form-item-url"> <label for="edit-url">Leave this field blank </label> <input autocomplete="off" type="text" id="edit-url" name="url" value="" size="20" maxlength="128" class="form-text" /> </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">Recommended Reading</div><div class="related-articles-wrapper"><a href="/software-development/php-foundation-breathes-new-resources-open-source-language" class="small-article-link"><article class="small-article"><div class="img-crop"><img loading="lazy" class="js-imgpxr" data-x2src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_retina/public/PHP-code.jpg?itok=MEMxW10S" src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_standard/public/PHP-code.jpg?itok=HXaAOYx5" width="90" height="83" alt="PHP inscription against laptop and code background" /></div><div class="small-article__inner"><div class="small-article__inner-title">PHP Foundation Breathes New Resources into Open Source Language</div><span>Nov 29, 2021</span></div></article></a><a href="/programming-languages/nodejs-17-extends-open-source-javascript-promise-apis" class="small-article-link"><article class="small-article"><div class="img-crop"><img loading="lazy" class="js-imgpxr" data-x2src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_retina/public/JavaScript-code_3.jpg?itok=-8MZxk6a" src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_standard/public/JavaScript-code_3.jpg?itok=2Lv1H6Om" width="90" height="83" alt="JavaScript code on computer screen" /></div><div class="small-article__inner"><div class="small-article__inner-title">Node.js 17 Extends Open Source JavaScript Promise APIs</div><span>Oct 20, 2021</span></div></article></a><article class="dfp-ad-hideempty hidden n_hidden small-article" data-dfp-position="native_related"></article><a href="/programming-languages/oracle-java-17-arrives-long-term-support" class="small-article-link"><article class="small-article"><div class="img-crop"><img loading="lazy" class="js-imgpxr" data-x2src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_retina/public/java-logo.gif?itok=ZQ_OyCZM" src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_standard/public/java-logo.gif?itok=XEjHh1ZT" width="90" height="83" alt="Java logo" /></div><div class="small-article__inner"><div class="small-article__inner-title">Oracle Java 17 Arrives with Long-Term Support</div><span>Sep 17, 2021</span></div></article></a><a href="/programming-languages/openjs-foundation-continues-grow-javascript-community" class="small-article-link"><article class="small-article"><div class="img-crop"><img loading="lazy" class="js-imgpxr" data-x2src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_retina/public/JavaScript-code_2.jpg?itok=URyAQOBK" src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_standard/public/JavaScript-code_2.jpg?itok=9fMiK4Yh" width="90" height="83" alt="JavaScript code" /></div><div class="small-article__inner"><div class="small-article__inner-title">OpenJS Foundation Continues to Grow JavaScript Community</div><span>Jun 10, 2021</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="/programming-languages/nodejs-17-extends-open-source-javascript-promise-apis?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 --> <footer class="corporate 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" loading="lazy" src="/sites/all/themes/penton_subtheme_itprotoday/images/logos/footer.png" alt="Logo" /></a> <div class="small-12 medium-5 columns"> <div class="footer-links"> </div> </div> </div> <div class="footer-content"> <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="https://www.itprotoday.com/advertise-itprotodaycom" 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> <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> <ul class="footer-min-col no-margin"> <li class="footer-min-col__item"> <a href="https://privacyportal-eu-cdn.onetrust.com/dsarwebform/c1f53e84-9f05-4169-a854-85052b63c50b/5f26b553-52cc-4973-a761-295d5634a6b6.html" class="footer-min-col-link">CCPA: Do not sell my personal info</a> </li> <li class="footer-min-col__item"> <a href="https://informa.com/privacy-policy" class="footer-min-col-link">Privacy Policy</a> </li> <li class="footer-min-col__item"> <a href="https://engage.informa.com/terms-of-service" class="footer-min-col-link">Terms of Service</a> </li> <li class="footer-min-col__item"> <a href="https://info.wrightsmedia.com/informa-licensing-reprints-request" class="footer-min-col-link">Content Licensing/Reprints</a> </li> <li class="footer-min-col__item"> <a href="https://engage.informa.com/cp/cookie-policy/" class="footer-min-col-link">Cookie Policy</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 aria-label="facebook" class="social-icons__icon fa fa-facebook"></i></a><a href="https://twitter.com/ITProToday" title="" class="social-icons__link"><i aria-label="twitter" class="social-icons__icon fa fa-twitter"></i></a><a href="https://www.linkedin.com/company/itpro-today/" title="" class="social-icons__link"><i aria-label="linkedin" class="social-icons__icon fa fa-linkedin"></i></a><a href="https://www.itprotoday.com/rss.xml" title="" class="social-icons__link"><i aria-label="rss" class="social-icons__icon fa fa-rss"></i></a></div></div> </div> </div> </div> <div class="l-corporate-footer"> <div class="l-corporate-footer-logo-copyrights-wrapper"> <div class="l-corporate-footer-logo-copyrights"> <div class="l-corporate-footer-logo"> <a href="https://tech.informa.com/"><img loading="lazy" src="/sites/all/themes/informa_midtheme_tech/images/corporate_footer_logo.png" alt="Informa Tech" /></a> </div> <div class="l-coporate-footer-copyright"> © 2021 Informa USA, Inc., All rights reserved </div> </div> </div> <div class="l-corporate-footer-links-wrapper"> <div class="l-coporate-footer-links"> <ul class="links"><li class="menu-1804 first"><a href="https://informa.com/privacy-policy/" title="">Privacy Policy</a></li> <li class="menu-1805"><a href="https://engage.informa.com/cp/cookie-policy/">Cookie Policy</a></li> <li class="menu-1806 last"><a href="http://engage.informa.com/terms-of-service" title="">Terms of Use</a></li> </ul> </div> </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> <!--[if lte IE 9]> <script type="text/javascript" src="/sites/itprotoday.com/files/advagg_js/js__o462xIvJcTydPQBQSqIGbKyyOKoMc_3r_T97VJ_RROY__31BaQp9J3_MoHTBfJ2Qk6iMaum0dQ1dSl1ZFkBJODzQ__dx85Ttf_A0Sq8VDZcItaBSSxlnEE8sGTynBc9WZgKg0.js#ie9-" onload="if(jQuery.isFunction(jQuery.holdReady)){jQuery.holdReady(true);jQuery.holdReady(true)} function advagg_mod_1(){advagg_mod_1.count=++advagg_mod_1.count||1;try{if(advagg_mod_1.count<=40){init_drupal_core_settings();advagg_mod_1.count=100}}catch(e){if(advagg_mod_1.count>=40){throw e}else window.setTimeout(advagg_mod_1,1)}} function advagg_mod_1_check(){if(window.init_drupal_core_settings&&window.jQuery&&window.Drupal){advagg_mod_1()}else window.setTimeout(advagg_mod_1_check,1)};advagg_mod_1_check();"></script> <![endif]--> <!--[if gt IE 9]> <script type="text/javascript" src="/sites/itprotoday.com/files/advagg_js/js__o462xIvJcTydPQBQSqIGbKyyOKoMc_3r_T97VJ_RROY__31BaQp9J3_MoHTBfJ2Qk6iMaum0dQ1dSl1ZFkBJODzQ__dx85Ttf_A0Sq8VDZcItaBSSxlnEE8sGTynBc9WZgKg0.js#ie10+" defer="defer" onload="if(jQuery.isFunction(jQuery.holdReady)){jQuery.holdReady(true);jQuery.holdReady(true)} function advagg_mod_1(){advagg_mod_1.count=++advagg_mod_1.count||1;try{if(advagg_mod_1.count<=40){init_drupal_core_settings();advagg_mod_1.count=100}}catch(e){if(advagg_mod_1.count>=40){throw e}else window.setTimeout(advagg_mod_1,1)}} function advagg_mod_1_check(){if(window.init_drupal_core_settings&&window.jQuery&&window.Drupal){advagg_mod_1()}else window.setTimeout(advagg_mod_1_check,1)};advagg_mod_1_check();"></script> <![endif]--> <!--[if !IE]><!--> <script type="text/javascript" src="/sites/itprotoday.com/files/advagg_js/js__o462xIvJcTydPQBQSqIGbKyyOKoMc_3r_T97VJ_RROY__31BaQp9J3_MoHTBfJ2Qk6iMaum0dQ1dSl1ZFkBJODzQ__dx85Ttf_A0Sq8VDZcItaBSSxlnEE8sGTynBc9WZgKg0.js" defer="defer" onload="if(jQuery.isFunction(jQuery.holdReady)){jQuery.holdReady(true);jQuery.holdReady(true)} function advagg_mod_1(){advagg_mod_1.count=++advagg_mod_1.count||1;try{if(advagg_mod_1.count<=40){init_drupal_core_settings();advagg_mod_1.count=100}}catch(e){if(advagg_mod_1.count>=40){throw e}else window.setTimeout(advagg_mod_1,1)}} function advagg_mod_1_check(){if(window.init_drupal_core_settings&&window.jQuery&&window.Drupal){advagg_mod_1()}else window.setTimeout(advagg_mod_1_check,1)};advagg_mod_1_check();"></script> <!--<![endif]--> <script type="text/javascript"> <!--//--><![CDATA[//><!-- (function(w){"use strict";if(!w.loadCSS)w.loadCSS=function(){};var rp=loadCSS.relpreload={};rp.support=(function(){var ret;try{ret=w.document.createElement("link").relList.supports("preload")}catch(e){ret=false};return function(){return ret}})();rp.bindMediaToggle=function(link){var finalMedia=link.media||"all" function enableStylesheet(){if(link.addEventListener){link.removeEventListener("load",enableStylesheet)}else if(link.attachEvent)link.detachEvent("onload",enableStylesheet);link.setAttribute("onload",null);link.media=finalMedia};if(link.addEventListener){link.addEventListener("load",enableStylesheet)}else if(link.attachEvent)link.attachEvent("onload",enableStylesheet);setTimeout(function(){link.rel="stylesheet";link.media="only x"});setTimeout(enableStylesheet,3e3)};rp.poly=function(){if(rp.support())return;var links=w.document.getElementsByTagName("link");for(var i=0;i<links.length;i++){var link=links[i];if(link.rel==="preload"&&link.getAttribute("as")==="style"&&!link.getAttribute("data-loadcss")){link.setAttribute("data-loadcss",true);rp.bindMediaToggle(link)}}};if(!rp.support()){rp.poly();var run=w.setInterval(rp.poly,500);if(w.addEventListener){w.addEventListener("load",function(){rp.poly();w.clearInterval(run)})}else if(w.attachEvent)w.attachEvent("onload",function(){rp.poly();w.clearInterval(run)})};if(typeof exports!=="undefined"){exports.loadCSS=loadCSS}else w.loadCSS=loadCSS}(typeof global!=="undefined"?global:this)); //--><!]]> </script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- function init_drupal_core_settings() {jQuery.extend(Drupal.settings, {"basePath":"\/","pathPrefix":"","ajaxPageState":{"theme":"penton_subtheme_itprotoday","theme_token":"RL0LV8OQeGTSBm8lkviFHkoxht2MGQptecukar4Ku9E","jquery_version":"1.10","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,"sites\/all\/modules\/contrib\/date\/date_popup\/themes\/datepicker.1.7.css":1,"modules\/field\/theme\/field.css":1,"sites\/all\/modules\/contrib\/logintoboggan\/logintoboggan.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\/custom\/magic_autocomplete_widget\/css\/select2.min.css":1,"sites\/all\/modules\/custom\/magic_autocomplete_widget\/css\/magic-autocomplete.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,"public:\/\/honeypot\/honeypot.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},"js":{"sites\/all\/modules\/contrib\/jquery_update\/replace\/jquery\/1.10\/jquery.min.js":1,"misc\/jquery.once.js":1,"misc\/drupal.js":1,"misc\/ajax.js":1}},"authcache":{"q":"node\/2429","cp":{"path":"\/","domain":".itprotoday.com","secure":true},"cl":23.14814814814815},"typekitId":"njq2hxj","adunit":"\/3834\/itprotoday.home","is_new_welcome_ad":1,"penton_custom_dfp":{"dfp_tags":{"everywhere":[],"article":{"native_leftrail_1":[{"disabled":false,"api_version":1,"machinename":"article_native_leftrail_1","slot":"[article] Native Left Rail 1","adunit":"\/3834\/itprotoday.home\/article\/software_development\/programming_languages","size":"fluid","block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"native_leftrail_1","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"nativekey_1_lft"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"nativekey_1_lft"},{"target":"ptype","value":"Article"},{"target":"nid","value":"2429"},{"target":"pterm","value":"programming_languages"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"native_leftrail_2":[{"disabled":false,"api_version":1,"machinename":"article_native_leftrail_2","slot":"[article] Native Left Rail 2","adunit":"\/3834\/itprotoday.home\/article\/software_development\/programming_languages","size":"fluid","block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"native_leftrail_2","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"nativekey_2_lft"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"nativekey_2_lft"},{"target":"ptype","value":"Article"},{"target":"nid","value":"2429"},{"target":"pterm","value":"programming_languages"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"native_related":[{"disabled":false,"api_version":1,"machinename":"article_native_related","slot":"[article] Native Related","adunit":"\/3834\/itprotoday.home\/article\/software_development\/programming_languages","size":"fluid","block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"native_related","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"nativekey_12_1"},{"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":"nativekey_12_1"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"2429"},{"target":"pterm","value":"programming_languages"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"native_inline":[{"disabled":false,"api_version":1,"machinename":"article_native_inline","slot":"[article] Native Inline","adunit":"\/3834\/itprotoday.home\/article\/software_development\/programming_languages","size":"fluid","block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"native_inline","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"nativekey_13_1"},{"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":"nativekey_13_1"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"2429"},{"target":"pterm","value":"programming_languages"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"right_rail_rect":[{"disabled":false,"api_version":1,"machinename":"_article_right_rail_rect","slot":"[article] [article] Right rail rect","adunit":"\/3834\/itprotoday.home\/article\/software_development\/programming_languages","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"right_rail_rect","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":"programming_languages"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"native_umpu":[{"disabled":false,"api_version":1,"machinename":"article_native_umpu","slot":"[article] Native Umpu","adunit":"\/3834\/itprotoday.home\/article\/software_development\/programming_languages","size":"fluid","block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"native_umpu","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"nativekey_3"},{"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":"nativekey_3"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"2429"},{"target":"pterm","value":"programming_languages"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"inarticle1":[{"disabled":false,"api_version":1,"machinename":"article_300_1_rht_infinite","slot":"[article] Rectangle Inline 1","adunit":"\/3834\/itprotoday.home\/article\/software_development\/programming_languages","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":"programming_languages"},{"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\/programming_languages","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":"programming_languages"},{"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\/programming_languages","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":"programming_languages"},{"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\/programming_languages","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":"programming_languages"},{"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\/programming_languages","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":"programming_languages"},{"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\/programming_languages","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":"programming_languages"},{"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\/programming_languages","size":[[728,90],[970,90],[320,50],[970,250]],"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,970x250,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],[970,250],[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":"programming_languages"},{"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\/programming_languages","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":"programming_languages"},{"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\/programming_languages","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"},{"target":"gdpr_banner","value":"off"}],"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":"programming_languages"},{"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\/programming_languages","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"},{"target":"gdpr_banner","value":"off"}],"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":"programming_languages"},{"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\/programming_languages","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"},{"target":"gdpr_banner","value":"off"}],"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":"programming_languages"},{"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\/programming_languages","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":"programming_languages"},{"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\/programming_languages","size":[160,65],"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":"programming_languages"},{"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\/programming_languages","size":[160,65],"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":"programming_languages"},{"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\/programming_languages","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":"programming_languages"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"reveal":[{"disabled":false,"api_version":1,"machinename":"article_reveal","slot":"[article] Reveal Ad","adunit":"\/3834\/itprotoday.home\/article\/software_development\/programming_languages","size":[1,1],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"reveal","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"reveal_1"},{"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":"reveal_1"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"2429"},{"target":"pterm","value":"programming_languages"},{"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\/programming_languages","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":"programming_languages"},{"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\/programming_languages","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":"programming_languages"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}],"sponsored_logo_weather":[{"disabled":false,"api_version":1,"machinename":"article_sponsored_logo_weather","slot":"[article] Sponsored Logo Weather","adunit":"\/3834\/itprotoday.home\/article\/software_development\/programming_languages","size":[[160,65],[125,125],[90,90]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"sponsored_logo_weather","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"sponsoredlogo_weather"},{"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":"sponsoredlogo_weather"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"2429"},{"target":"pterm","value":"programming_languages"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}]},"taxonomy":{"native_article_4":[{"disabled":false,"api_version":1,"machinename":"term_native_article_4","slot":"[taxonomy] Native Article 4","adunit":"\/3834\/itprotoday.home\/article\/software_development\/programming_languages","size":"fluid","block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"taxonomy","position":"native_article_4","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"nativekey_10"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"nativekey_10"},{"target":"ptype","value":"Article"},{"target":"nid","value":"2429"},{"target":"pterm","value":"programming_languages"},{"target":"author","value":"dan_wahlin"},{"target":"reg","value":"anonymous"}]}]}},"current_type":"article","default_adunit":"\/3834\/itprotoday.home","brand_adunit":"","async_rendering":1,"single_request":0,"collapse_empty_divs":"1","viewport":1,"lifetime_banner":"2000","do_byline":0,"enable_sticky":1,"enable_cb_refresh":0,"cb_refresh_interval":"15","is_blocked_ip":false,"uip":"54.80.173.217"},"is_new_article_view":0,"penton_eloqua_api":{"eloqua_site_id":"1885539667","eloqua_subdomain":"","tracking_enabled":1,"fields":["nl","utm_rid"]},"CToolsModal":{"loadingText":"Loading...","closeText":"Close Window","closeImage":"\u003Cimg src=\u0022https:\/\/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=\u0022https:\/\/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"},"gdpr_countries":[],"prevent_js_alerts":{"module_path":"sites\/all\/modules\/contrib\/prevent_js_alerts"},"ws_pb":{"countlayout":"horizontal"},"informa_gtm":{"user":{"profile":{"profileInfo":{"profileID":null,"userName":null,"email":null}},"segment":{"loginStatus":"unreg","permission":"anonymous"}},"page":{"pageInfo":{"pageName":"New XML Features in .NET Version 2: Part I","destinationURL":"https:\/\/www.itprotoday.com\/microsoft-visual-studio\/new-xml-features-net-version-2-part-i","pageID":"336d338c-1a33-4e9c-9312-7f1434723814","author":"Dan Wahlin","issueDate":"Oct 30, 2009"},"attributes":{"destinationPath":"\/microsoft-visual-studio\/new-xml-features-net-version-2-part-i","taxonomy":"Programming Languages","buyerJourney":null,"permission":"public","subType1":"Article","subType2":null,"visibility":"visible","programs":null,"scrollCount":"10","scrollPosition":"1_of_10","contentSponsor":null,"byline":"Dan Wahlin","contentLabel":null},"category":{"pageType":"article","primaryCategory":"Software Development \u003E Programming Languages"}}},"informa_gtm_events":[],"penton_gdpr":{"banner":"\u003Cdiv\u003E\n \u003Cdiv class=\u0022gdpr-popup-border\u0022\u003E\n \u003Cdiv class=\u0022gdrp-popup-content\u0022\u003E\n \u003Cdiv id=\u0022popup-text\u0022\u003E\n This website uses cookies, including third party ones, to allow for analysis of how people use our website in order to improve your experience and our services. By continuing to use our website, you agree to the use of such cookies. Click here for more information on our \u003Ca href=\u0022http:\/\/corporate.knect365.com\/privacy-centre\/our-cookie-policy\/\u0022 target=\u0022_blank\u0022\u003ECookie Policy\u003C\/a\u003E and \u003Ca href=\u0022https:\/\/knect365.com\/privacy-policy\u0022 target=\u0022_blank\u0022\u003EPrivacy Policy\u003C\/a\u003E.\u200b \u003C\/div\u003E\n \u003Cdiv id=\u0022popup-buttons\u0022\u003E\n \u003Cspan class=\u0022close-button\u0022\u003E\u0026times;\u003C\/span\u003E\n \u003C\/div\u003E\n \u003C\/div\u003E\n \u003C\/div\u003E\n\u003C\/div\u003E\n"},"advagg_font":{"proxima-nova":"proxima-nova","jaf-bernino-sans-condensed":"jaf-bernino-sans-condensed","gotham-light":"Gotham-Light","merriweather-light":"Merriweather-Light","merriweather-bold":"Merriweather-Bold","gotham":"Gotham","merriweather":"Merriweather","helvetica-neue":"Helvetica Neue","consolas":"Consolas"},"advagg_font_storage":1,"advagg_font_cookie":1,"advagg_font_no_fout":0,"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":2,"shiftEnterMode":3,"toolbarStartupExpanded":true,"width":"100%","skin":"moono-lisa","format_tags":"p;div;pre;address;h1;h2;h3;h4;h5;h6","show_toggle":"t","default":"t","ss":2,"loadPlugins":{"drupalbreaks":{"name":"drupalbreaks","desc":"Plugin for inserting Drupal teaser and page breaks.","path":"\/sites\/all\/modules\/contrib\/ckeditor\/plugins\/drupalbreaks\/","buttons":{"DrupalBreak":{"label":"DrupalBreak","icon":"images\/drupalbreak.png"}},"default":"t"}},"entities":false,"entities_greek":false,"entities_latin":false,"scayt_autoStartup":false,"js_conf":{"fillEmptyBlocks":false},"stylesCombo_stylesSet":"drupal:\/sites\/all\/modules\/contrib\/ckeditor\/ckeditor.styles.js","contentsCss":["\/sites\/all\/modules\/contrib\/ckeditor\/css\/ckeditor.css?r3msqz","\/sites\/all\/modules\/contrib\/ckeditor\/ckeditor\/contents.css?r3msqz"]}},"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":"uABpe3TpEP2CItEWrSaUnXAVVxaYjdhc-qWtmSqdRfo","xss_url":"\/ckeditor\/xss","theme":"penton_subtheme_itprotoday","elements":{"edit-comment-body-2429":"comments"},"autostart":{"edit-comment-body-2429":true},"timestamp":"r3msqz"},"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}}); if(jQuery.isFunction(jQuery.holdReady)){jQuery.holdReady(false);}} if(window.jQuery && window.Drupal){init_drupal_core_settings();} //--><!]]> </script> <script type="text/javascript" src="https://www.googletagservices.com/tag/js/gpt.js"></script> <script type="text/javascript" src="/sites/itprotoday.com/files/advagg_js/js__SI_3Jf1LswSYIPT2nOt89AVh__7kVYL_o5gkJN-XCW0__HlD2qoOEx_TcmqkvBYdBmKiy_MjdqNZuD8zu4HgaztA__dx85Ttf_A0Sq8VDZcItaBSSxlnEE8sGTynBc9WZgKg0.js" defer="defer"></script> <script type="text/javascript" src="/sites/itprotoday.com/files/advagg_js/js__LOTzmTjOEyBYTRa73tu6Fj3qY7yfNxJxX3y1JUwojnc__40YrL2aSiZmfap0peqfapAZpogiJynGBflb-zJ7vQQo__dx85Ttf_A0Sq8VDZcItaBSSxlnEE8sGTynBc9WZgKg0.js" defer="defer" async="async"></script> <script type="text/javascript" src="/sites/itprotoday.com/files/advagg_js/js__tySr6wQRZH62UkgX3pOEVXIqzqYYtt8E471UGbxtwtI__2RmKGZ3EHh3IkUBOLmUwOhDRYEgq9DFt9okzXO0u56M__dx85Ttf_A0Sq8VDZcItaBSSxlnEE8sGTynBc9WZgKg0.js" defer="defer"></script> <script type="text/javascript" src="/sites/itprotoday.com/files/advagg_js/js__E3u8USQplSZ5KJ7H1a04va3fLnxx2SBJ-VuwgI4-0Sk__AdhAFZ5QAk_VrKkFUOCnxJb9ANrhuWlKf15A7QHm14M__dx85Ttf_A0Sq8VDZcItaBSSxlnEE8sGTynBc9WZgKg0.js" defer="defer" async="async"></script> <script type="text/javascript" src="/sites/itprotoday.com/files/advagg_js/js__6yeE2nNBsFfdTwfOlbg9lyoa1PlwfaWwa57z5jXs10g__S10D4czJRfLzuo3HQKlzPiHW_tMA7wmh2uzi0PVxSi4__dx85Ttf_A0Sq8VDZcItaBSSxlnEE8sGTynBc9WZgKg0.js" defer="defer"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- function advagg_mod_2(){advagg_mod_2.count=++advagg_mod_2.count||1;try{if(advagg_mod_2.count<=40){window.CKEDITOR_BASEPATH="/sites/all/modules/contrib/ckeditor/ckeditor/";advagg_mod_2.count=100}}catch(e){if(advagg_mod_2.count>=40){throw e}else window.setTimeout(advagg_mod_2,250)}} function advagg_mod_2_check(){if(window.jQuery&&window.Drupal&&window.Drupal.settings){advagg_mod_2()}else window.setTimeout(advagg_mod_2_check,250)};advagg_mod_2_check(); //--><!]]> </script> <script type="text/javascript" src="/sites/itprotoday.com/files/advagg_js/js__ax5VN18vQmrA6FY5TS3SYpdt18hbOFOcJ4xQWmOYupM__b4P84_OG40cORUStfoBMlsQBpuCqapg8tcK1vmR-pks__dx85Ttf_A0Sq8VDZcItaBSSxlnEE8sGTynBc9WZgKg0.js" defer="defer"></script> </div> </body> </html>