<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cameron McKay &#187; visual basic</title>
	<atom:link href="http://cdmckay.org/blog/tag/visual-basic/feed/" rel="self" type="application/rss+xml" />
	<link>http://cdmckay.org/blog</link>
	<description>Programming and Game Development</description>
	<lastBuildDate>Mon, 14 May 2012 21:11:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Creating an HTML document with .NET</title>
		<link>http://cdmckay.org/blog/2009/02/01/creating-an-html-document-with-net/</link>
		<comments>http://cdmckay.org/blog/2009/02/01/creating-an-html-document-with-net/#comments</comments>
		<pubDate>Sun, 01 Feb 2009 08:15:09 +0000</pubDate>
		<dc:creator>cdmckay</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[vb]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[visual basic]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://couchware.ca/blogs/cam/?p=43</guid>
		<description><![CDATA[Sometimes when you&#8217;re programming, you&#8217;ll want to generate an HTML document. This may be because you&#8217;re writing some sort of web app, or maybe you want your program to be able to output in a web-friendly format. The String Concatenation Approach Whatever your reason is for generating HTML, the best bet is your first prototype [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes when you&#8217;re programming, you&#8217;ll want to generate an HTML document.  This may be because you&#8217;re writing some sort of web app, or maybe you want your program to be able to output in a web-friendly format.</p>
<p><span id="more-43"></span></p>
<h3>The String Concatenation Approach</h3>
<p>Whatever your reason is for generating HTML, the best bet is your first prototype looked something like this:</p>
<p><em>(Aside: All this code is in VB.NET&#8230; the original VB.NET (i.e. not 2005 or later).  It also assumes ASP.NET 1.1.  This is because the client I work for still uses this technology, so all my experience is with it.  The code should still be fine though, as all versions of .NET after 1.1 are more or less backwards compatible.)</em></p>

<div class="wp_syntax"><div class="code"><pre class="asp" style="font-family:monospace;"><span style="color: #008000;">' Run some query on the database.</span>
<span style="color: #990099; font-weight: bold;">Dim</span> dataTable <span style="color: #330066;">As</span> DataTable <span style="color: #006600; font-weight: bold;">=</span> Query<span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color: #008000;">' Dump it into an HTML document.</span>
<span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #cc0000;">&quot;&lt;html&gt;&quot;</span> + Environment.<span style="color: #9900cc;">NewLine</span><span style="color: #006600; font-weight:bold;">&#41;</span>
<span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #cc0000;">&quot;&lt;head&gt;&lt;title&gt;Database Table&lt;/title&gt;&lt;/head&gt;&quot;</span><span style="color: #006600; font-weight:bold;">&#41;</span>
<span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span>Environment.<span style="color: #9900cc;">NewLine</span><span style="color: #006600; font-weight:bold;">&#41;</span>
<span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #cc0000;">&quot;&lt;body&gt;&quot;</span> + Environment.<span style="color: #9900cc;">NewLine</span><span style="color: #006600; font-weight:bold;">&#41;</span>
<span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #cc0000;">&quot;&lt;table&gt;&quot;</span> + Environment.<span style="color: #9900cc;">NewLine</span><span style="color: #006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color: #008000;">' Print the rows.</span>
<span style="color: #990099; font-weight: bold;">For</span> <span style="color: #990099; font-weight: bold;">Each</span> row <span style="color: #330066;">As</span> DataRow <span style="color: #990099; font-weight: bold;">In</span> dataTable
  <span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #cc0000;">&quot;&lt;tr&gt;&quot;</span><span style="color: #006600; font-weight:bold;">&#41;</span>
  <span style="color: #008000;">' Print the cells.</span>
  <span style="color: #990099; font-weight: bold;">For</span> <span style="color: #990099; font-weight: bold;">Each</span> item <span style="color: #330066;">As</span> Object <span style="color: #990099; font-weight: bold;">In</span> row
    <span style="color: #990099; font-weight: bold;">If</span> IsDBNull<span style="color: #006600; font-weight:bold;">&#40;</span>item<span style="color: #006600; font-weight:bold;">&#41;</span> <span style="color: #006600; font-weight: bold;">=</span> <span style="color: #0000ff; font-weight: bold;">False</span> <span style="color: #990099; font-weight: bold;">Then</span>
      <span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #cc0000;">&quot;&lt;td&gt;&quot;</span> + <span style="color: #990099; font-weight: bold;">CStr</span><span style="color: #006600; font-weight:bold;">&#40;</span>item<span style="color: #006600; font-weight:bold;">&#41;</span> + <span style="color: #cc0000;">&quot;&lt;/td&gt;&quot;</span><span style="color: #006600; font-weight:bold;">&#41;</span>
    <span style="color: #990099; font-weight: bold;">Else</span>
      <span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #cc0000;">&quot;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&quot;</span><span style="color: #006600; font-weight:bold;">&#41;</span>
    <span style="color: #990099; font-weight: bold;">End</span> <span style="color: #990099; font-weight: bold;">If</span>
  <span style="color: #990099; font-weight: bold;">End</span> <span style="color: #990099; font-weight: bold;">For</span>
  <span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #cc0000;">&quot;&lt;/tr&gt;&quot;</span><span style="color: #006600; font-weight:bold;">&#41;</span>
<span style="color: #990099; font-weight: bold;">End</span> <span style="color: #990099; font-weight: bold;">For</span>
&nbsp;
<span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #cc0000;">&quot;&lt;/table&gt;&quot;</span> + Environment.<span style="color: #9900cc;">NewLine</span><span style="color: #006600; font-weight:bold;">&#41;</span>
<span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #cc0000;">&quot;&lt;/body&gt;&quot;</span> + Environment.<span style="color: #9900cc;">NewLine</span><span style="color: #006600; font-weight:bold;">&#41;</span>
<span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #cc0000;">&quot;&lt;/html&gt;&quot;</span> + Environment.<span style="color: #9900cc;">NewLine</span><span style="color: #006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Now don&#8217;t get me wrong, this code will do the trick.  But as you write it, you start to feel a bit dirty.  HTML is a language for representing hierarchies, yet you&#8217;re concatenating strings.  You start to feel like there&#8217;s a more elegant way to do it, a way that takes advantage of the structure of HTML.</p>
<p>And there is.</p>
<h3>The Programmatic Approach</h3>
<p>Ok, so we want to take an approach that has some knowledge of the HTML we&#8217;re writing.  Enter XML.  .NET uses XML for, among other things, it&#8217;s <a href="http://en.wikipedia.org/wiki/Javadoc">Javadoc</a>-like documentation generator and it&#8217;s ASP.NET config files.  With XML so prevalent in .NET, it&#8217;s not surprising to discover that it&#8217;s part of the standard library, in the namespace <code>System.Xml</code>.</p>
<p>So you&#8217;re thinking &#8220;Cameron, who cares about XML, I want to make an HTML document!&#8221;  Gear down, sugar plum, XML can still help!  As you may or may not know, HTML (at least the XHTML dialects) is a reformulation of XML.  That is, an XHTML document is an XML document.  As a result, we can use .NET&#8217;s built-in XML support to generate an HTML document.</p>
<p>Thus, if we want to write the same code in previous example in .NET XML, we would do the following.  First, we would need to make a new XML document.  That&#8217;s easy enough:</p>

<div class="wp_syntax"><div class="code"><pre class="vbnet" style="font-family:monospace;"><span style="color: #0600FF;">Imports</span> System.<span style="color: #0000FF;">Xml</span>
&nbsp;
<span style="color: #008080; font-style: italic;">' Create a new XML document.</span>
<span style="color: #0600FF;">Dim</span> xmlDoc <span style="color: #FF8000;">As</span> XmlDocument <span style="color: #008000;">=</span> <span style="color: #FF8000;">New</span> XmlDocument</pre></div></div>

<p>Now we want to start writing some HTML.  So let&#8217;s create our <code>html</code> tag and add some headers.</p>

<div class="wp_syntax"><div class="code"><pre class="vbnet" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">' Create the html tag.</span>
<span style="color: #0600FF;">Dim</span> xmlRoot <span style="color: #FF8000;">As</span> XmlElement <span style="color: #008000;">=</span> xmlDoc.<span style="color: #0000FF;">CreateElement</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">&quot;html&quot;</span><span style="color: #000000;">&#41;</span>
xmlDoc.<span style="color: #0000FF;">AppendChild</span><span style="color: #000000;">&#40;</span>xmlRoot<span style="color: #000000;">&#41;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">' Create the head tag and append it under the html element.</span>
<span style="color: #0600FF;">Dim</span> xmlHead <span style="color: #FF8000;">As</span> XmlElement <span style="color: #008000;">=</span> xmlDoc.<span style="color: #0000FF;">CreateElement</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">&quot;head&quot;</span><span style="color: #000000;">&#41;</span>
xmlRoot.<span style="color: #0000FF;">AppendChild</span><span style="color: #000000;">&#40;</span>xmlHead<span style="color: #000000;">&#41;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">' Create the title tag, set it's text to &quot;Database Table&quot;</span>
<span style="color: #008080; font-style: italic;">' and append it under the head element.</span>
<span style="color: #0600FF;">Dim</span> xmlTitle <span style="color: #FF8000;">As</span> XmlElement <span style="color: #008000;">=</span> xmlDoc.<span style="color: #0000FF;">CreateElement</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">&quot;title&quot;</span><span style="color: #000000;">&#41;</span>
xmlTitle.<span style="color: #0000FF;">AppendChild</span><span style="color: #000000;">&#40;</span>xmlDoc.<span style="color: #0000FF;">CreateTextNode</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">&quot;Database Table&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
xmlHead.<span style="color: #0000FF;">AppendChild</span><span style="color: #000000;">&#40;</span>xmlTitle<span style="color: #000000;">&#41;</span></pre></div></div>

<p>Wow, that&#8217;s a lot of code.  What&#8217;s going on there?  First, let&#8217;s look at the <code>XmlDocument</code> class.  This is important when we&#8217;re generating XML documents.  It&#8217;s what we use to create new elements.  However, even though it creates new elements, it doesn&#8217;t add them to the document.  Thus, we need to use the <code>AppendChild</code> method of the appropriate element to add it to the document.  As you can see above, we created a root element (<code>html</code>) and added that to the XML document (<code>xmlDoc</code>) first.  Then we created a <code>head</code> element, and added that to the root element, not the <code>xmlDoc</code>.  This was done in order to form a hierarchy, which is, in essence, what a XML (and by extension HTML) document is.</p>
<p>Here is what the resulting XML/XHTML document would look like so far:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Database Table<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>So far so good, let&#8217;s finish it off.  Here&#8217;s the rest of the code we&#8217;d need to make our simple HTML document:</p>

<div class="wp_syntax"><div class="code"><pre class="vbnet" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">' Create the body element and append it to the root.</span>
<span style="color: #0600FF;">Dim</span> xmlBody <span style="color: #FF8000;">As</span> XmlElement <span style="color: #008000;">=</span> xmlDoc.<span style="color: #0000FF;">CreateElement</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">&quot;body&quot;</span><span style="color: #000000;">&#41;</span>
xmlRoot.<span style="color: #0000FF;">AppendChild</span><span style="color: #000000;">&#40;</span>xmlBody<span style="color: #000000;">&#41;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">' Create the table and append it.</span>
<span style="color: #0600FF;">Dim</span> xmlTable <span style="color: #FF8000;">As</span> XmlElement <span style="color: #008000;">=</span> xmlDoc.<span style="color: #0000FF;">CreateElement</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">&quot;table&quot;</span><span style="color: #000000;">&#41;</span>
xmlBody.<span style="color: #0000FF;">AppendChild</span><span style="color: #000000;">&#40;</span>xmlTable<span style="color: #000000;">&#41;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">' Create the rows.</span>
<span style="color: #FF8000;">For</span> <span style="color: #0600FF;">Each</span> row <span style="color: #FF8000;">As</span> DataRow In dataTable
  <span style="color: #0600FF;">Dim</span> xmlRow <span style="color: #FF8000;">As</span> XmlElement <span style="color: #008000;">=</span> xmlDoc.<span style="color: #0000FF;">CreateElement</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">&quot;tr&quot;</span><span style="color: #000000;">&#41;</span>
  xmlTable.<span style="color: #0000FF;">AppendChild</span><span style="color: #000000;">&#40;</span>xmlRow<span style="color: #000000;">&#41;</span>
&nbsp;
  <span style="color: #008080; font-style: italic;">' Create the cells.</span>
  <span style="color: #FF8000;">For</span> <span style="color: #0600FF;">Each</span> item <span style="color: #FF8000;">As</span> <span style="color: #FF0000;">Object</span> In row
    <span style="color: #0600FF;">Dim</span> content <span style="color: #FF8000;">As</span> <span style="color: #FF8000;">String</span> <span style="color: #008000;">=</span> <span style="color: #808080;">&quot;&quot;</span>
    <span style="color: #0600FF;">If</span> IsDBNull<span style="color: #000000;">&#40;</span>item<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=</span> <span style="color: #0600FF;">False</span> <span style="color: #FF8000;">Then</span> content <span style="color: #008000;">=</span> <span style="color: #0600FF;">CStr</span><span style="color: #000000;">&#40;</span>item<span style="color: #000000;">&#41;</span>
    <span style="color: #0600FF;">Dim</span> xmlCell <span style="color: #FF8000;">As</span> XmlElement <span style="color: #008000;">=</span> xmlDoc.<span style="color: #0000FF;">createElement</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">&quot;td&quot;</span><span style="color: #000000;">&#41;</span>
    xmlCell.<span style="color: #0000FF;">AppendChild</span><span style="color: #000000;">&#40;</span>xmlDoc.<span style="color: #0000FF;">createTextNode</span><span style="color: #000000;">&#40;</span>content<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
    xmlRow.<span style="color: #0000FF;">AppendChild</span><span style="color: #000000;">&#40;</span>xmlCell<span style="color: #000000;">&#41;</span>
  <span style="color: #0600FF;">End</span> <span style="color: #FF8000;">For</span>
<span style="color: #0600FF;">End</span> <span style="color: #FF8000;">For</span>
&nbsp;
<span style="color: #008080; font-style: italic;">' Write the XML/HTML document.</span>
Response.<span style="color: #0600FF;">Write</span><span style="color: #000000;">&#40;</span>xmlDoc.<span style="color: #0000FF;">OuterXml</span><span style="color: #000000;">&#41;</span></pre></div></div>

<p>And there you have it: a programmatic way to generate an HTML document.  So why bother?  Here&#8217;s a few reasons:</p>
<p><strong>Safety</strong>.  If you generate your HTML document by concatenating strings, there&#8217;s a chance you might forget to close a tag.  If you generate the document programmatically, you can ensure that all your tags will always be closed.</p>
<p><strong>Maintainability and readability</strong>.  I&#8217;ve had to deal with code where the HTML is generated by concatenation.  It&#8217;s confusing and frustrating.  If you generate your HTML documents programmatically, it&#8217;s a lot easier for a future programmer to follow what&#8217;s going on (especially if you, y&#8217;know, document it).</p>
<p><strong>Reusability and modifiability</strong>.  If you create your HTML document as a flat string, it makes it really hard to modify and reuse elsewhere in your code.  For example, if you wanted to add a tag in the middle of your HTML document using the string concatenation method, you will have to do a lot of painful string manipulations.  With the programmatic approach, it&#8217;s as simple as just calling <code>AppendChild</code> on the appropriate <code>XmlElement</code>.</p>
<p>Using an <code>XmlDocument</code> to represent an XML document just makes sense.  It&#8217;s less crude and more versatile.</p>
]]></content:encoded>
			<wfw:commentRss>http://cdmckay.org/blog/2009/02/01/creating-an-html-document-with-net/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

