<?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>BigBasti&#039;s Blog &#187; XML</title>
	<atom:link href="http://blog.bigbasti.com/category/xml/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.bigbasti.com</link>
	<description>About Me &#38; my Digital Lifestyle</description>
	<lastBuildDate>Wed, 25 Jan 2012 12:31:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Entstehung einer ASP.NET Webanwendung anhand eines Beispiels</title>
		<link>http://blog.bigbasti.com/entstehung-einer-asp-net-webanwendung-anhand-eines-beispiels/</link>
		<comments>http://blog.bigbasti.com/entstehung-einer-asp-net-webanwendung-anhand-eines-beispiels/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 12:22:55 +0000</pubDate>
		<dc:creator>Michael Bernhard</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1724</guid>
		<description><![CDATA[Mit diesem Artikel will ich skizzieren wie eine Webanwendung mittels ASP.NET entworfen und umgesetzt wird. Ich will einen Einblick in die Vorüberlegungen, sowie in die Umsetzung des Projektes geben. Nicht mehr, aber auch nicht weniger.
Vorüberlegungen
Wie fast alle Hobbyprogrammierer erstelle auch ich eine Unzahl unnötiger und zum Teil auch unsinniger Anwendungen. Dies ist der Luxus ...]]></description>
			<content:encoded><![CDATA[<p>Mit diesem Artikel will ich skizzieren wie eine Webanwendung mittels ASP.NET entworfen und umgesetzt wird. Ich will einen Einblick in die Vorüberlegungen, sowie in die Umsetzung des Projektes geben. Nicht mehr, aber auch nicht weniger.</p>
<h3>Vorüberlegungen</h3>
<p>Wie fast alle Hobbyprogrammierer erstelle auch ich eine Unzahl unnötiger und zum Teil auch unsinniger Anwendungen. Dies ist der Luxus den man sich leisten kann, wenn man damit nicht sein Geld verdienen muss.</p>
<p>Da ich ab und zu auf Dienstreise gehe, ist die aktuelle Uhrzeit am gegenwärtigen Standort immer ein Thema. Oft kommt auch die Frage auf, wie spät es denn bei den Lieben zu Hause wohl sein mag.</p>
<p>Hierfür  kommt natürlich nur, mein neuestes Steckenpferd, eine Webanwendung in Frage.</p>
<h3>Die ersten Überlegungen:</h3>
<p><span style="text-decoration: underline;"> </span></p>
<ol>
<li>Welcher Aufbau einer Webanwendung ist der beste</li>
<li>Wie ermittle ich meinen aktuellen Standort</li>
<li>Welche zusätzlichen Informationen kann ich noch anzeigen</li>
</ol>
<h4>1. Welcher Aufbau einer Webanwendung ist der beste?</h4>
<p>Ich hab mich hier, sehr schnell, für eine Webanwendung entschieden, die ihre Informationen aus einem RSS-Feed bezieht. Vorteil hierbei, es handelt sich um ein XML-Format, welches leicht zu lesen ist und auch anderweitig verwendet werden kann.<br />
Eine Windows-, Linux-, MacOS- oder Android Anwendung könnte den RSS-Feed ebenfalls nutzen.</p>
<h4>2. Wie ermittle ich meinen aktuellen Standort</h4>
<p>Im Prinzip wäre GPS das ideale Werkzeug um den aktuellen Standort auf der Welt bestimmen zu können. Da ich jedoch nur ein Notebook auf meinen Dienstreisen zur Verfügung habe, fällt das mit dem GPS aus, denn die wenigsten Notebooks verfügen über GPS – meines schon gar nicht.</p>
<p>Eine weitere Möglichkeit meinen Standort zu bestimmen wäre über die IP Adresse, mit der sich mein Computer über den jeweiligen Provider mit dem Internet verbindet. Nicht sehr genau, aber wenn es um die Zeitzone geht – genau genug.</p>
<p>Eine andere Alternative, die mir erst vor kurzem bekannt wurde, ist die Ermittlung des Standortes via HTML 5 – Voraussetzung hierfür sind ein Browser der diese neue Technologie unterstützt und aktiviertes JavaScript.</p>
<p>Die Umsetzung via HTML 5 ist zudem genauer als der Weg über die IP-Adresse. Ideal wäre also die Verknüpfung beider Techniken.</p>
<p>Da meine Seite aktuell mit der IP-Adresse arbeitet, möchte ich das als Basis der folgenden Abhandlungen nehmen.</p>
<h4>3. Welche zusätzlichen Informationen kann ich noch anzeigen</h4>
<p>Weitere Informationen bietet ASP.NET von allein. IP-Adresse, Sprache, Browser, Auflösung usw.</p>
<p>&nbsp;</p>
<h3>Die Umsetzung:</h3>
<p>Wie schon erwähnt ist ein RSS-Feed nichts anderes als eine XML Datei. Diese wird als Antwort (Response) auf eine Anfrage (Request) vom Webservice zurückgegeben.</p>
<p>Im Prinzip also recht einfach</p>
<ol>
<li>Daten ermitteln</li>
<li>XML erstellen</li>
<li>Daten zurückgeben</li>
</ol>
<h4>Überlegung:</h4>
<p>Welche Daten benötigen wir und welche Daten soll der RSS-Feed zusätzlich enthalten?</p>
<p>Im Prinzip benötigen wir nur drei Werte um die aktuelle Uhrzeit und Zeitzone übermitteln zu können.</p>
<ol>
<li>Die Zeitzone als ID – damit kann dann ganz einfach die passende      Zeitzone auf dem Windows-PC gefunden werden.<br />
(Wie das auf einem MAC OS oder einem Linux Rechner umgesetzt werden kann      wäre eine weitere Überlegung wert)</li>
<li>Die Zeitverschiebung in Stunden (Als Basis gilt hier immer die      koordinierte Weltzeit)</li>
<li>Die Zeitverschiebung in Minuten (Als Basis gilt hier immer die      koordinierte Weltzeit)</li>
</ol>
<p>&nbsp;</p>
<p>Alle weiteren Daten sind Beiwerk und blähen unseren RSS-Feed nur auf. Aber wer kommt denn schon ohne Beiwerk aus?</p>
<p>Interessant sind natürlich auch</p>
<ol>
<li>Die momentane IP-Adresse</li>
<li>Die eingestellte Sprache</li>
<li>Der aktuelle Ort (Stadt) bzw. das Land</li>
<li>Die Region (hier kommen wir später darauf zurück)</li>
<li>Die Geokoordinaten (geographische Länge und Breite)</li>
</ol>
<h4>Umsetzung:</h4>
<p>Die erste Schwierigkeit besteht darin aus der IP-Adresse den aktuellen Standort zu ermitteln.</p>
<p>Hierfür gibt es eine Menge Webservices, die aber alle nicht sehr aktuell sind und ihre Daten nicht so einfach zur Verfügung stellen wollen.</p>
<p>Als die beste aller Möglichkeiten hat sich die <a href="http://www.maxmind.com/app/geolitecity">MaxMind GeoLight City</a> Datenbank in Verbindung mit dem <a href="http://de.googlemaps.subgurim.net/">Google Maps UserControl von SubGurim.net</a> gezeigt.<br />
Nachteil hier – die Datenbank ist 30MB schwer und muss jeden Monat aktualisiert werden, da sich die IP-Adressen ständig ändern. Was soviel heißt wie, je länger der Monat dauert je ungenauer die Angaben.</p>
<p>Abhilfe würde hier die kostenpflichtige Datenbank schaffen – diese ist zwar noch Größer wird aber in einem kürzeren Zyklus aktualisiert. Da ich das Ganze aber nur als Hobby-Projekt umsetzen will, sind mir die Kosten dafür zu hoch.</p>
<p>Die kostenpflichtige Datenbank gibt es ebenfalls <a href="http://www.maxmind.com/app/geolitecity">hier (GeoCity)</a> und kann natürlich auch mit dem gleichen UserControl betrieben werden.</p>
<p>Ich hab mich für das Binary Format der Datenbank entschieden, da diese Version in Verbindung mit dem SubGurim UserControl sehr schnell ist. Die Zugriffszeiten auf meinen RSS-Feed liegen bei etwa 0.5 Sekunden.</p>
<p>Das SubGurim Control wurde für ASP.NET 2.0 entwickelt, arbeitet aber auch im Framework 4 ohne Probleme.</p>
<p>Bindet man nun alles ein – ein Lesen der Dokumentation hilft wie immer weiter - reduziert sich der Code zur Ermittlung der Geokoordinaten auf</p>
<pre>
<pre class="brush: vb; ">

Dim location As Location = GetLocationFromIP(userIP)
</pre>
</pre>
<p>Im Prinzip schon fast alles. Nur war es nicht unser Ziel die Geokoordinaten zu ermitteln, wir wollten die Uhrzeit und Zeitzone am aktuellen Standort ermitteln.</p>
<h4>Anmerkung:</h4>
<p>Die Klasse Location ist hier ein Teil des SubGurim.Net UserControls und enthält neben den GeoKoordinaten auch die ermittelte Stadt, das Land (beides als Klartext) und die Region als Kürzel (z.B. 02 = Bayern, 05 = Hessen).</p>
<p>Da ich für die nächsten Schritte keine weiteren Controls, Dll’s oder anderes frei verfügbares Werkzeug gefunden habe, musste ich die Verknüpfung der Standortdaten zur Zeitzone und das Decodieren des Regionkürzels selbst erledigen.</p>
<h4>Überlegung:</h4>
<p>Ein jeder Punkt dieser Welt gehört einer bestimmten Zeitzone an. Hier gilt es 3 Fälle zu beachten.</p>
<ol>
<li>Länder die als Ganzes einer Zeitzone angehören (z.B. Deutschland,      Österreich, Schweiz)</li>
<li>Länder die mehreren Zeitzonen angehören (z.B. USA, Russland,      Indonesien)</li>
<li>Gebiete die nicht erfasst werden können (Oceane und Wüsten)</li>
</ol>
<p><strong>1. Länder die als Ganzes einer Zeitzone angehören</strong></p>
<p>Die einfachste Form, die Inhalte der Klasse Location können direkt zur Ermittlung der Zeitzone herangezogen werden.</p>
<p>Vereinfacht: Land = Zeitzone = Zeitverschiebung</p>
<p><strong>2. Länder die mehreren Zeitzonen angehören</strong></p>
<p>Nicht mehr ganz so einfach. Die Zeitzone wird hier anhand des Landes und der Region bestimmt.</p>
<p>Vereinfacht: Land (z.B. USA) - Region (z.B. CA - Kalifornien) = Zeitzone = Zeitverschiebung</p>
<p>Sonderfall: Eine Region enthält mehrere Zeitzonen (z.B. USA/Indiana – Eastern- und Central Time)</p>
<p>Hierfür habe ich noch keine Lösung – mir fehlen die genauen Daten – aber vermutlich wird es dann eine weitere Unterteilung anhand der ermittelten Stadt geben.</p>
<p>Land (z.B. USA) – Region (z.B. IN - Indiana) – Stadt (?) = Zeitzone = Zeitverschiebung</p>
<p><strong>3. Gebiete die nicht erfasst werden können</strong></p>
<p>Da es auf dem Meer oder in der Wüste keinen Provider bzw. keine Empfang gibt, kann dieser Fall ausgeschlossen werden.</p>
<p>Lösung hierfür wäre eine Ermittlung des Standortes via Geokoordinaten (GPS), was im Moment noch nicht umgesetzt wurde.</p>
<p>Die beschriebene Funktionalität hab ich in eine DLL gepackt, das alles beschreiben zu wollen würde hier aber zu weit führen.</p>
<p>Die Punkte 1. und 2. werden komplett durch eine List(of Structure) abgebildet, die alle Länder dieser Welt, inkl. den unter 2. beschriebenen Fällen, enthält.</p>
<pre>
<pre class="brush: vb; ">

    Public Structure myTimeZone
        Public Country As String
        Public Region As String
        Public TimeZoneInfo As TimeZoneInfo

        Public Sub New(ByVal c As String, ByVal r As String, ByVal tzi As TimeZoneInfo)
            Country = c
            Region = r
            TimeZoneInfo = tzi
        End Sub
    End Structure

Private mytimezones As New List(Of myTimeZone)
</pre>
</pre>
<p>Die Klasse „TimeZoneInfo“ ist schon Bestandteil des Frameworks und bildet die auf dem jeweiligen System installierten Zeitzonen ab.</p>
<p>Die durch das SubGurim.Net UserControl bereitgestellten Informationen (Klasse Location) dienen somit als Filter für die Suche innerhalb der Liste. Die dadurch ermittelten Daten können nun den RSS-Feed füllen.</p>
<h3>Erstellen eines RSS-Feeds:</h3>
<p>Wie schon erwähnt ist ein RSS-Feed nichts anderes als eine XML-Datei welche durch eine Webseite zurückgegeben wird.</p>
<p>Dies kann auf vielfältige Art und Weiße geschehen.</p>
<p>Anfangs erstellte ich meinen Feed innerhalb einer WebForm (*.aspx). Später jedoch bin ich auf eine <a href="http://www.aspcode.net/Creating-an-RSS-feed-for-your-ASPNET-site.aspx">Methode</a> gestoßen, die mir eleganter erschien, nämlich das Erstellen eines RSS-Feeds mittels eines „Generic Handlers“ (*.ashx)</p>
<p>Im Prinzip wird nichts anderes gemacht, als den kompletten Feed mittels LINQ zusammenzubauen und am Schluss als Response zurückzugeben.</p>
<pre>
<pre class="brush: vb; ">

Dim doc As New XDocument()

Dim rss As New XElement(&quot;rss&quot;)
rss.Add(New XAttribute(&quot;version&quot;, &quot;2.0&quot;))

Dim channel As New XElement(&quot;channel&quot;)
rss.Add(channel)

channel.Add(New XElement(&quot;title&quot;, &quot;The TimeZoneNotifier RSS-Feed&quot;))
channel.Add(New XElement(&quot;link&quot;, &quot;http://TimeZoneNotifier.free-file-download.de&quot;))
channel.Add(New XElement(&quot;description&quot;, &quot;This site detects the timezone you&#039;re currently staying in !&quot;))
channel.Add(New XElement(&quot;ttl&quot;, &quot;60&quot;))

Dim item As New XElement(&quot;item&quot;)

Channel.Add(item)

item.Add(New XElement(&quot;userIP&quot;, userIP))
item.Add(New XElement(&quot;userBrowser&quot;, userBrowser))
item.Add(New XElement(&quot;userLanguage&quot;, userLanguage))
item.Add(New XElement(&quot;userCity&quot;, userCity))
item.Add(New XElement(&quot;userRegion&quot;, userRegion))
item.Add(New XElement(&quot;userLongitude&quot;, userLongitude))
item.Add(New XElement(&quot;userLatitude&quot;, userLatitude))
item.Add(New XElement(&quot;userTimeOffsetHours&quot;, userTimeOffsetHours))
item.Add(New XElement(&quot;userTimeOffsetMinutes&quot;, userTimeOffsetMinutes))
item.Add(New XElement(&quot;CurrentUTCTime&quot;, CurrentUTCTime.ToString))
item.Add(New XElement(&quot;userTimeZone&quot;, userTimeZone))

doc.Add(rss)
</pre>
</pre>
<p>(Den RSS-Feed wie er dann ausgegeben wird, sehen Sie am Ende dieses Artikels)</p>
<p>Sind wir erst einmal hier angekommen, wurde die meiste Arbeit schon erledigt. Der Rest besteht nur noch im Anzeigen der ermittelten Daten.</p>
<h3>Anzeigen der Daten mittels einer WebForm:</h3>
<p>Hier zum Verständnis, noch der Code für die Anzeige der Daten.</p>
<p>Da wir den Feed mittels einer Webanwendung abfragen, sind manche Informationen für den RSS-Feed nicht sichtbar. Bei diesen Daten verwerfen wir die Informationen die der RSS-Feed enthält einfach und füllen die Ausgabe mit den Werten der WebForm.</p>
<pre>
<pre class="brush: vb; ">

Protected Sub Page_Load(ByVal sender As Object, _
                    ByVal e As System.EventArgs) Handles Me.Load

if Postback Then
&#039;RSS-Feed holen
    Dim retRss As New Xml.XmlDocument
    retRss.Load(&quot;http://timezonenotifier.free-file-download.de/rss.ashx?ip=&quot; &amp;amp;amp; _
                Request.UserHostAddress)
    &#039;IP-Adresse das Feeds stimmt
    Me.LabelIP.Text = retRss.SelectSingleNode(&quot;/rss/channel/item/userIP&quot;).InnerText
    &#039;Wurde eine nicht gültige IP-Adresse erkannt -&gt; Anzeigen der Daten abbrechen
    If Me.LabelIP.Text = &quot;No valid IP-Adress !!&quot; Then
        Exit Sub
    End If
    &#039;Kein Browser im RSS-Feed vorhanden, da vom Server aus angefragt wird
    Me.LabelBrowser.Text = Request.Browser.Browser
    &#039;Keine Sprache im RSS-Feed vorhanden, da vom Server aus angefragt wird
    Try
        Dim ci As New CultureInfo(Request.UserLanguages(0))
        Me.LabelLanguage.Text = ci.DisplayName
    Catch ex As Exception
        Me.LabelLanguage.Text = &quot;Unknown&quot;
    End Try
    &#039;erkannte Stadt
    Me.LabelCity.Text =
        retRss.SelectSingleNode(&quot;/rss/channel/item/userCity&quot;).InnerText
    &#039;erkannte Region
    Me.LabelRegion.Text =
        retRss.SelectSingleNode(&quot;/rss/channel/item/userRegion&quot;).InnerText
    &#039;erkannte Geogr. Länge
    Me.LabelLong.Text =
        retRss.SelectSingleNode(&quot;/rss/channel/item/userLongitude&quot;).InnerText
    &#039;erkannte Geogr. Breite
    Me.LabelLat.Text =
        retRss.SelectSingleNode(&quot;/rss/channel/item/userLatitude&quot;).InnerText
    &#039;erkannte Zeitverschiebung
    Dim _offsethours As Integer =
        CInt(retRss.SelectSingleNode(&quot;/rss/channel/item/userTimeOffsetHours&quot;).InnerText)
    Dim _offsetminutes As Integer =
        CInt(retRss.SelectSingleNode(&quot;/rss/channel/item/userTimeOffsetMinutes&quot;).InnerText)
    &#039;aktuelle Zeit am Standort berechnen
    Dim tempRSS As String =
        retRss.SelectSingleNode(&quot;/rss/channel/item/CurrentUTCTime&quot;).InnerText
    Me.LabelCurrentTime.Text =
        CDate(tempRSS).AddHours(_offsethours).AddMinutes(_offsetminutes).ToLongDateString &amp;amp;amp; &quot; - &quot; &amp;amp;amp; CDate(tempRSS).AddHours(_offsethours).AddMinutes(_offsetminutes).ToLongTimeString

    Me.LabelCurrentTimeDiff.Text = _offsethours.ToString &amp;amp;amp; _
        &quot; h &quot; &amp;amp;amp; _offsetminutes.ToString &amp;amp;amp; &quot; min&quot;
    &#039;erkannte Zeitzone
    Me.LabelCurrentTimezone.Text =
        retRss.SelectSingleNode(&quot;/rss/channel/item/userTimeZone&quot;).InnerText
Else
    &#039;kein Postback
End If
End Sub
</pre>
</pre>
<h3>Die Ergebnisse meiner Arbeit:</h3>
<p>Das oben beschriebene hab ich unter <a href="http://timezonenotifier.free-file-download.de/">http://timezonenotifier.free-file-download.de</a> als ASP.NET Webseite veröffentlicht.<br />
Den RSS-Feed gibt es unter <a href="http://timezonenotifier.free-file-download.de/rss.ashx">http://timezonenotifier.free-file-download.de/rss.ashx</a><br />
RSS-Feed (mein Standort)<br />
&lt;pre&gt;
<pre class="brush: xml; ">

&lt;rss version=&quot;2.0&quot;&gt;
    &lt;channel&gt;
        &lt;title&gt;The TimeZoneNotifier RSS-Feed&lt;/title&gt;
        &lt;link&gt;http://TimeZoneNotifier.free-file-download.de&lt;/link&gt;
        &lt;description&gt;
            This site detects the timezone you&#039;re currently staying in !
        &lt;/description&gt;
        &lt;ttl&gt;60&lt;/ttl&gt;
        &lt;item&gt;
            &lt;userIP&gt;79.249.177.227&lt;/userIP&gt;
            &lt;userBrowser&gt;Chrome&lt;/userBrowser&gt;
            &lt;userLanguage&gt;Deutsch (Deutschland)&lt;/userLanguage&gt;
            &lt;userCity&gt;Mering / Germany&lt;/userCity&gt;
            &lt;userRegion&gt;Bayern&lt;/userRegion&gt;
            &lt;userLongitude&gt;10,9833&lt;/userLongitude&gt;
            &lt;userLatitude&gt;48,2667&lt;/userLatitude&gt;
            &lt;userTimeOffsetHours&gt;2&lt;/userTimeOffsetHours&gt;
            &lt;userTimeOffsetMinutes&gt;0&lt;/userTimeOffsetMinutes&gt;
            &lt;CurrentUTCTime&gt;07.06.2011 09:40:14&lt;/CurrentUTCTime&gt;
            &lt;userTimeZone&gt;
                (UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien
            &lt;/userTimeZone&gt;
       &lt;/item&gt;
    &lt;/channel&gt;
&lt;/rss&gt;
</pre>
<p><strong><span style="text-decoration: underline;">Quellen:</span></strong></p>
<p><strong><span style="text-decoration: underline;"> </span></strong></p>
<p><a href="http://www.maxmind.com/app/geolitecity">http://www.maxmind.com/app/geolitecity</a><br />
<a href="http://de.googlemaps.subgurim.net/">http://de.googlemaps.subgurim.net/</a><br />
<a href="http://lukencode.com/2010/05/19/ip-to-geo-location-in-asp-net-mvc/">http://lukencode.com/2010/05/19/ip-to-geo-location-in-asp-net-mvc/</a><br />
<a href="http://www.aspcode.net/Creating-an-RSS-feed-for-your-ASPNET-site.aspx">http://www.aspcode.net/Creating-an-RSS-feed-for-your-ASPNET-site.aspx</a></p>
<p><strong><span style="text-decoration: underline;">Copyright:</span></strong></p>
<p>Die Rechte der verwendeten Datenbanken und des UserControls liegt bei den Autoren.</p>
<p>Der angebotene RSS-Feed darf frei verwendet werden – eine Nennung der Quelle des Feeds bzw. der Adresse dieses Artikels wird vorausgesetzt.</p>
<p>Ein Dank geht an Sebastian Gross der mir einige Anregungen gegeben hat.</p>
<p>Dieser Service bleibt kostenlos, die Bedingungen zur Nutzung des RSS-Feed können sich jedoch jederzeit ändern.</p>
<h3>Über den Autor</h3>
<p><img class="alignleft" src="http://server.bigbasti.com/uploads/uploads/86211149149524767.png" alt="" width="134" height="100" /></p>
<p><strong>Michael   Bernhard</strong><br />
Hobby-Programmierer von VB.NET, C# und   ASP.NET Anwendungen. Hauptberuflich als Inbetriebnehmer bei der <a href="http://www.boewe-systec.de/">Böwe Systec GmbH</a> beschäftigt. Vorzeigbare Projekte – <a href="http://timezonenotifier.free-file-download.de/">TimeZone Notifier</a> und <a href="http://www.tsv-neusaess-junioren.de/">TSV Neusäß Junioren</a>.</p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.bigbasti.com%2fentstehung-einer-asp-net-webanwendung-anhand-eines-beispiels%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.bigbasti.com%2fentstehung-einer-asp-net-webanwendung-anhand-eines-beispiels%2f" border="0" alt="kick it on dotnet-kicks.de" /></a></p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1724&amp;md5=bd784c748bb963ab313ceb590366fd31" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/entstehung-einer-asp-net-webanwendung-anhand-eines-beispiels/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET: Mit Extension Methods arbeiten</title>
		<link>http://blog.bigbasti.com/net-mit-extension-methods-arbeiten/</link>
		<comments>http://blog.bigbasti.com/net-mit-extension-methods-arbeiten/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 07:41:31 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1225</guid>
		<description><![CDATA[Aus gegebenen Anlass möchte ich heute einen kleinen Artikel zu dem Thema Extension Methods in .NET schreiben, einfach nur weil es eine sehr simple Möglichkeit bietet sich das Leben zu erleichtern. Falls es euch nichts sagt, mit Extension Methods, die  es seit C# 3.0 gibt ist es möglich bestehende Klassen, sogar interne Core-Klassen wie ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.bigbasti.com/uploads/2010-08-16-09-12-29.png"><img class="alignleft size-full wp-image-1227" title="2010-08-16 09 12 29" src="http://blog.bigbasti.com/uploads/2010-08-16-09-12-29.png" alt="" width="137" height="104" /></a>Aus gegebenen Anlass möchte ich heute einen kleinen Artikel zu dem Thema <a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx" target="_blank">Extension Methods</a> in .NET schreiben, einfach nur weil es eine sehr simple Möglichkeit bietet sich das Leben zu erleichtern. Falls es euch nichts sagt, mit Extension Methods, die  es seit C# 3.0 gibt ist es möglich bestehende Klassen, sogar interne Core-Klassen wie Integer oder String mit eigenen Methoden zu erweitern.</p>
<p>Wieso das nützlich ist fragst du dich? Na ganz einfach, habt ihr schon mal die Methode String.toInt32() vermisst? Diese ist nur eine (sehr simple) Methode, die man häufiger gebrauchen könnte, die es aber nicht gibt. Diese könnte man sehr einfach mit einer Extension Method erweitern.</p>
<p>Als Beispiel möchte ich hier aber <a href="http://blog.bigbasti.com/xml-den-namen-eines-xmlnode-aendern/" target="_blank">den Artikel von vor ein paar Tagen</a> nehmen, wo wir eine Methode erstellt haben mit der man ein XmlElement in einem XmlDocument umbenennen konnte. Dies mussten wir machen, da die Klasse XmlDocument keine Methode dafür anbietet. Nun wollen wir mal die XmlDocument Klasse um diese Methode erweitern.</p>
<p>Das ganze funktioniert sehr einfach:</p>
<pre>
<pre class="brush: csharp; ">

    public static class XmlDocumentExtension
    {
        public static bool RenameXmlElement(this XmlDocument doc,
                                            XmlElement oldElement,
                                            string newName) {
            try {
                //Neues XmlElement mit neuem namen anlegen
                XmlElement newElement = oldElement.OwnerDocument.CreateElement(newName);

                //Dem neuen XmlElement alle Attribute des alten Elements übergeben
                foreach (XmlAttribute a in oldElement.Attributes) {
                    newElement.SetAttributeNode((XmlAttribute)a);
                }

                //Dem neuen XmlElement alle Kinder Elemente des alten Elements anhängen
                foreach (XmlNode n in oldElement.ChildNodes) {
                    newElement.AppendChild(n.Clone());
                }

                oldElement.ParentNode.ReplaceChild(newElement, oldElement);
            } catch {
                return false;
            }

        return true;
        }
    }
</pre>
</pre>
<p>Wir legen eine ganz normale Klasse an, diese kann heißen wie man will, ich habe sie hier nur zum besseren Verständnis so benannt. In der klasse legen wir nun die Funktion an um die wir unsere Klasse erweitern wollen. Hierbei ist wichtig, dass sowohl die Klasse als auch die Funktion als public und static markiert wird. Des Weiteren sollte man einen Verweis auf System.Code.dll setzen.</p>
<p>Bei der Deklaration der Funktion muss man dann angeben welche Klasse erweitert werden soll. Hier erweitern wir die Klasse XmlDocument weswegen vor diesem Parameter noch ein this steht. Dieser Parameter wird nur dazu benötigt und muss dann später bei dem Aufruf der Funktion nicht gesetzt werden.</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/2010-08-16-09-35-56.png"><img class="aligncenter size-full wp-image-1235" title="2010-08-16 09 35 56" src="http://blog.bigbasti.com/uploads/2010-08-16-09-35-56.png" alt="" width="682" height="220" /></a><em>Bild 1: Auch IntelliSense erkennt unsere Erweiterung an und bietet diese an</em></p>
<p>Natürlich bleibt die "original" Klasse XmlDocument unberührt von dieser Aktion und wird nur <em>virtuell </em>erweitert. Diese Erweiterung ist natürlich auch nur für das Aktuelle Projekt nutzbar.</p>
<p>Ich finde dieses Feature wirklich sehr nützlich und kann es euch deswegen auch nur empfehlen.</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 308px; width: 1px; height: 1px; overflow: hidden;">public static bool RenameXmlElement(this XmlDocument doc,<br />
XmlElement oldElement,<br />
string newName) {<br />
try {<br />
//Neues XmlElement mit neuem namen anlegen<br />
XmlElement newElement = oldElement.OwnerDocument.CreateElement(newName);</p>
<p>//Dem neuen XmlElement alle Attribute des alten Elements übergeben<br />
foreach (XmlAttribute a in oldElement.Attributes) {<br />
newElement.SetAttributeNode((XmlAttribute)a);<br />
}</p>
<p>//Dem neuen XmlElement alle Kinder Elemente des alten Elements anhängen<br />
foreach (XmlNode n in oldElement.ChildNodes) {<br />
newElement.AppendChild(n.Clone());<br />
}</p>
<p>oldElement.ParentNode.ReplaceChild(newElement, oldElement);<br />
} catch {<br />
return false;<br />
}</p>
<p>return true;<br />
}</p>
</div>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1225&amp;md5=7c1e1c0160b9df9d359303cbd7d76248" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/net-mit-extension-methods-arbeiten/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>XML: Den Namen eines XmlNode Aendern</title>
		<link>http://blog.bigbasti.com/xml-den-namen-eines-xmlnode-aendern/</link>
		<comments>http://blog.bigbasti.com/xml-den-namen-eines-xmlnode-aendern/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 10:31:18 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1186</guid>
		<description><![CDATA[Wenn man unter .NET mit XML Dokumenten arbeitet, nimmt man sehr oft Änderungen am Dokument vor. Doch letztens ist mir aufgefallen, dass eine der einfachsten Änderungen garnicht so einfach ist, nämlich wenn man den Namen eines XmlNode ändern will. Also die XmlNode.Name Eigenschaft.

Denn wenn man mal einen Blick ins MSDN wirft wird man feststellen, ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.bigbasti.com/uploads/xml_at_work.gif"><img class="alignleft size-medium wp-image-1187" title="xml_at_work" src="http://blog.bigbasti.com/uploads/xml_at_work-300x184.gif" alt="" width="146" height="89" /></a>Wenn man unter .NET mit XML Dokumenten arbeitet, nimmt man sehr oft Änderungen am Dokument vor. Doch letztens ist mir aufgefallen, dass eine der einfachsten Änderungen garnicht so einfach ist, nämlich wenn man den Namen eines XmlNode ändern will. Also die XmlNode.Name Eigenschaft.</p>
<p>Denn wenn man mal einen Blick ins <a href="http://msdn.microsoft.com/de-de/library/system.xml.xmlnode.name.aspx" target="_blank">MSDN</a> wirft wird man feststellen, dass diese Eigenschaft read-only ist! Das ist natürlich blöd, da man nun keinen einfachen Weg hat den Namen des Knotens zu ändern.</p>
<p>Wenn man diesen aber unbedingt ändern will muss man das über einen kleinen Umweg machen. Man muss ein neues XmlElement erstellen und dabei den Namen ändern, anschließend noch alle Attribute und Kinder-Elemente des alten Elements übernehmen und an der Stelle des alten wieder in das XmlDocument einfügen.</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/xmlnodeprob.png"><img class="aligncenter size-full wp-image-1194" title="xmlnodeprob" src="http://blog.bigbasti.com/uploads/xmlnodeprob.png" alt="" width="486" height="165" /></a><em>Bild 1: Struktur &amp; Änderungswunsch</em></p>
<p>Konkret sieht das Ganze so aus: C#</p>
<pre>
<pre class="brush: csharp; ">

        private void Form1_Load(object sender, EventArgs e) {
            //XmlDomument erstellen und eine Xml-Datei laden
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(Application.StartupPath + &quot;\\xml.xml&quot;);

            //Zur Demonstration die alte XML-Struktur ausgeben
            System.Console.WriteLine(xmlDoc.OuterXml);

            //Das Element das umbenannt werden soll heraussuchen
            XmlElement oldElement = (XmlElement)xmlDoc.GetElementsByTagName(&quot;books&quot;)[0];

            //Das herausgesuchte Element mit einem neuen Namen klonen
            XmlElement newElement = renameXmlElement(oldElement, &quot;my-books&quot;);

            //Das alte Element mit dem neuen ersetzen
            oldElement.ParentNode.ReplaceChild(newElement, oldElement);

            //Kontrolle: Die neue Struktur ausgeben
            System.Console.WriteLine(xmlDoc.OuterXml);

            xmlDoc.Save(Application.StartupPath + &quot;\\xml.xml&quot;);
        }

        public static XmlElement renameXmlElement(XmlElement e, string newname) {
            //Neues XmlElement mit neuem namen anlegen
            XmlElement newElement = e.OwnerDocument.CreateElement(newname);

            //Dem neuen XmlElement alle Attribute des alten Elements übergeben
            foreach (XmlAttribute a in e.Attributes) {
                newElement.SetAttributeNode((XmlAttribute)a);
            }

            //Dem neuen XmlElement alle Kinder Elemente des alten Elements anhängen
            foreach (XmlNode n in e.ChildNodes) {
                newElement.AppendChild(n.Clone());
            }

            //Das neue XmlElement zurückgeben
            return newElement;
        }
</pre>
</pre>
<p>Und hier das Ganze noch mal in VB.NET:</p>
<pre>
<pre class="brush: vb.net; ">

Private Sub Form1_Load(sender As Object, e As EventArgs)
	&#039;XmlDomument erstellen und eine Xml-Datei laden
	Dim xmlDoc As New XmlDocument()
	xmlDoc.Load(Application.StartupPath + &quot;\xml.xml&quot;)

	&#039;Zur Demonstration die alte XML-Struktur ausgeben
	System.Console.WriteLine(xmlDoc.OuterXml)

	&#039;Das Element das umbenannt werden soll heraussuchen
	Dim oldElement As XmlElement = DirectCast(xmlDoc.GetElementsByTagName(&quot;books&quot;)(0), XmlElement)

	&#039;Das herausgesuchte Element mit einem neuen Namen klonen
	Dim newElement As XmlElement = renameXmlElement(oldElement, &quot;my-books&quot;)

	&#039;Das alte Element mit dem neuen ersetzen
	oldElement.ParentNode.ReplaceChild(newElement, oldElement)

	&#039;Kontrolle: Die neue Struktur ausgeben
	System.Console.WriteLine(xmlDoc.OuterXml)

	xmlDoc.Save(Application.StartupPath + &quot;\xml.xml&quot;)
End Sub

Public Shared Function renameXmlElement(e As XmlElement, newname As String) As XmlElement
	&#039;Neues XmlElement mit neuem namen anlegen
	Dim newElement As XmlElement = e.OwnerDocument.CreateElement(newname)

	&#039;Dem neuen XmlElement alle Attribute des alten Elements übergeben
	For Each a As XmlAttribute In e.Attributes
		newElement.SetAttributeNode(DirectCast(a, XmlAttribute))
	Next

	&#039;Dem neuen XmlElement alle Kinder Elemente des alten Elements anhängen
	For Each n As XmlNode In e.ChildNodes
		newElement.AppendChild(n.Clone())
	Next

	&#039;Das neue XmlElement zurückgeben
	Return newElement
End Function
</pre>
</pre>
<p>Kompliziert ist es natürlich nicht, aber trotzdem etwas ärgerlich, dass man diese Methode dann doch selber implementieren muss.</p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1186&amp;md5=ef323258e68c09afaea604a6809738c1" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/xml-den-namen-eines-xmlnode-aendern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VB.NET: FitzBox IP erneuern ueber uPnP</title>
		<link>http://blog.bigbasti.com/vb-net-fitzbox-ip-erneuern-uber-upnp/</link>
		<comments>http://blog.bigbasti.com/vb-net-fitzbox-ip-erneuern-uber-upnp/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 19:10:37 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=828</guid>
		<description><![CDATA[Die FritzBox ist als Router weit verbreitet und bietet einen Haufen an Konfigurationsmöglichkeiten an. Eins der nützlichsten Features ist uPnP (Universal Plug and Play). Diese Schnittstelle bietet uns eine sehr bequeme Möglichkeit mit dem Gerät zu kommunizieren ohne dass man einen Benutzernamen oder ein Kennwort benötigt!

Wer öfter mal im Internet unterwegs ist, kennst sicherlich ...]]></description>
			<content:encoded><![CDATA[<p>Die FritzBox ist als Router weit verbreitet und bietet einen Haufen an Konfigurationsmöglichkeiten an. Eins der nützlichsten Features ist uPnP (Universal Plug and Play). Diese Schnittstelle bietet uns eine sehr bequeme Möglichkeit mit dem Gerät zu kommunizieren ohne dass man einen Benutzernamen oder ein Kennwort benötigt!</p>
<p>Wer öfter mal im Internet unterwegs ist, kennst sicherlich mehrere gute Gründe seine IP zu wechseln. Und das ist sehr einfach, denn alles was dafür nötig ist, ist eine erneute Einwahl ins Internet.</p>
<p>Dies kann man sehr einfach über die Benutzeroberfläche der FritzBox machen oder einfach "oldschool"-mäßig das Netzwerkkabel aus der FritzBox ziehen und wieder einstecken. (Letzteres erfordert ebenfalls keinen Benutzernamen und Passwort)</p>
<p>Doch wenn man des öfteren auf diese Funktionalität angewiesen ist, ist es doch relativ nervig und umständlich. Deswegen werden wir hier ein einfaches kleines Programm entwickeln, dass für uns den Router zu einer Neueinwahl ins Internet "zwingt".</p>
<p>Wie oben bereits erwöhnt heißt die Technologie dafür<a title="Wikipedia" href="http://de.wikipedia.org/wiki/Universal_Plug_and_Play" target="_blank"> UPnP (Universal Plug and Play)</a>. Über diese Technologie lassen sich sehr viele Befehle an die Fritzbox senden, vorausgesetzt, man befindet sich in dem selben Netzwerk.</p>
<p>Von Statusabfragen über Auslastungen und Übertragung, lassen sich sogar Telefonnummern anwählen und Anrufe steuern, im Prinzip kann man alle Funktionen darüber ansteuern. Hier gibts eine nette <a href="http://wehavemorefun.de/fritzbox/Hilfsprogramme_/_Tipps_&amp;_Tricks#Statusanfragen_per_UPnP" target="_blank">Übersicht mit vielen Beispielen</a>.</p>
<p>Wie werden die Anfragen eigentlich an die Fritzbox übertragen? Das geschieht sehr einfach über einen POST Aufruf, denn auf der Fritzbox (und auch auf den meisten anderen Routern) läuft ein kleiner Webserver denn man ganz einfach über den Browser erreicht, wenn man die adresse "fritz.box" in die Adresszeile tippt.</p>
<p>Dort ist die Fritzbox genauso aufgebaut wie eine gewöhnliche Webseite. Und diese nimmt auch POST und GET aufrufe entgegen. Genau hier setzen wir an und werden unsere Befehle rüber schicken.</p>
<pre>
<pre class="brush: vb.net; ">

        Dim client As New TcpClient

        client.Connect(&quot;fritz.box&quot;, 49000)

        Dim stream As NetworkStream = client.GetStream
        Dim bytes As Byte() = New Byte((My.Resources.msg.Length)) {}

        bytes = Encoding.ASCII.GetBytes(My.Resources.msg)

        stream.Write(bytes, 0, bytes.Length)
        bytes = New Byte(1024) {}

        Dim str As String = String.Empty

        Dim count As Integer = stream.Read(bytes, 0, bytes.Length)

        str = Encoding.ASCII.GetString(bytes, 0, count)

        stream.Close()
        client.Close()
</pre>
</pre>
<p>Der Code ist sehr simpel, wir erstellen uns einen WebClient und verbinden uns mit der FritzBox. Nach der Verbindung senden wir ein POST Request raus und lesen anschließend die Antwort wieder aus.</p>
<p>Mit dem obigen Code senden wir folgenden Befehl an die Fritzbox:</p>
<pre>
<pre class="brush: xml; ">

POST /upnp/control/WANIPConn1 HTTP/1.1
HOST: fritz.box:49000
SOAPACTION: &quot;urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination&quot;
CONTENT-TYPE: text/xml ; charset=&quot;utf-8&quot;
Content-Length: 293

&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:Envelope s:encodingStyle=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; xmlns:s=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;&gt;
   &lt;s:Body&gt;
      &lt;u:ForceTermination xmlns:u=&quot;urn:schemas-upnp-org:service:WANIPConnection:1&quot; /&gt;
   &lt;/s:Body&gt;
&lt;/s:Envelope&gt;
</pre>
</pre>
<p>Wie man sieht ist der Befehl ein gewöhnlicher POST Aufruf inkl. Header. Dieser übergibt einen Befehl urn:schemas-"upnp-org:service:WANIPConnection:1#ForceTermination", der der Fritzbox sagt die Verbindung ins Internet neu aufzubauen.</p>
<p>Man muss hierbei sehr aufpassen, besonders die Content-Length Angabe muss genaustens passen, da sonst ein Fehler als Antwort eintrudelt.</p>
<p>Wie immer gibts auch eine kleine Demoanwendung.</p>
<div style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/fritzbox.png"><img class="aligncenter size-full wp-image-830" title="fritzbox" src="http://blog.bigbasti.com/uploads/fritzbox.png" alt="" width="511" height="312" /></a><em>Bild 1: Das Demo Programm in action</em></div>
<div style="text-align: center;"><em><br />
</em></div>
<p>Download hier: <a href="http://blog.bigbasti.com/fritzreset_demo" target="_blank">Download</a> [VS 2008 Projekt]</p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=828&amp;md5=b82779fc9c7211b11397e280d4151bdc" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/vb-net-fitzbox-ip-erneuern-uber-upnp/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>VB.NET: Bilder Hochladen mit der TwitPic API Teil 3</title>
		<link>http://blog.bigbasti.com/vbnet-bilder-hochladen-mit-der-twitpic-api-teil-3/</link>
		<comments>http://blog.bigbasti.com/vbnet-bilder-hochladen-mit-der-twitpic-api-teil-3/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 16:19:03 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[VB]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=425</guid>
		<description><![CDATA[In dem dritten Teil der API-Reihe möchte ich euch zeigen wie man mit Hilfe der TwitPic API Bilder hochladen kann.

Diesesmal schreibt die API vor, dass man POST-Requests verwendet um der Seite Daten zu senden. Das macht die Sache etwas komplizierter, und dazu kommt noch, dass wir auch noch ein Bild verschicken müssen, also müssen ...]]></description>
			<content:encoded><![CDATA[<p>In dem dritten Teil der API-Reihe möchte ich euch zeigen wie man mit Hilfe der TwitPic API Bilder hochladen kann.</p>
<p>Diesesmal schreibt die <a href="http://twitpic.com/api.do" target="_self">API</a> vor, dass man POST-Requests verwendet um der Seite Daten zu senden. Das macht die Sache etwas komplizierter, und dazu kommt noch, dass wir auch noch ein Bild verschicken müssen, also müssen auchnoch binäre Daten verschickt werden. Aber langsam, erstmal die Theorie!</p>
<p>Ihr kennt doch sicher die normalen Eingabemasken wie zB. die von <a href="http://imageshack.us/" target="_self">imageshack.us</a>. Diese besteht aus einem Dateiauswahlfeld, mehreren Checkboxen und einem Textfeld. Wer schonmal HTML gemacht hat wird wissen dass dieses Gebilde aus so genannten Interaktiven Elementen ein Formular darstellt welches nach dem Betätigen des Senden-Buttons an eine vorher definierte Adresse gesendet wird!</p>
<p>Dabei sendet der Browser einen HTTP POST-Request an den Server. Ein solcher Request besteht für gewöhnlich aus einem Kopf, den Daten und einem Fuß. So könnte zB. ein HTTP POST-Request aussehen:</p>
<pre class="brush: vb.net; ">

POST /wiki/Spezial:Search HTTP/1.1
Host: de.wikipedia.org
Content-Type: application/x-www-form-urlencoded
Content-Length: 24
search=Katzen&amp;amp;amp;amp;go=Artikel
</pre>
<p>Der Server verwertet diese Daten dann und schickt eine Antwort. Je nachdem wie wir angefragt haben bekommen wir als Antwort eine XML-Struktur (Wie in den Letzten Beispielen) oder eine HTML Struktur. Die Kommunikation geschieht dabei auf dem HTTP Port 80 und läuft über das TCP Protokoll!</p>
<p>In den letzten beiden Teilen haben wir jeweils so genannte GET-Requests erstellt, bei denen nur der URL-Strang mit den Variablen versandt wurde.</p>
<p>Da wir aber nun ein Bild übertragen wollen, müssen wir versuchen ein POST-Request-Objekt zu erstellen, das wir dann an den TwitPic Server schicken können.</p>
<p>Unser POST-Objekt muss dabei folgende Daten übermitteln:</p>
<ul>
<li>Unseren Twitter Benutzernamen</li>
<li>Unser Twitter Passwort</li>
<li>Das Bild das wir einstellen wollen</li>
</ul>
<p>Wenn wir diese Daten nun in unser Objekt verfrachten, müssen wir dafür sorgen, dass der Server später weis, was was ist und die Daten von einander trennen kann. Deswegen müssen wir für jeden Eintrag einen eigenen Head und Body erzeugen.</p>
<p>Das Bild muss dann auch in das binäre Format umgewandelt werden und dann mit den anderen Daten durch ein Strom an den Server gesendet werden! - Hört sich kompliziert an, ich weis aber es hält sich in Grenzen!</p>
<p>Hier erstmal der Code für das Hochladen des Objekts mit allen Daten und der Abruf der Antwort. Tipp: Ihr könnt den Code besser lesen, wenn ihr auf den Knopf oben rechts in der Code Darstellung klickt!</p>
<pre>
<pre class="brush: vb.net; ">

    Public Function uploadPic(ByVal pic As Byte(), ByVal filename As String, ByVal user As String, ByVal pass As String)
        Dim encoding As String = &quot;iso-8859-1&quot;

        &#039;Erzeugen einer einzigartigen identifikation
        Dim gui As String = Guid.NewGuid().ToString()

        &#039;Diese wird für den Header und den footer der Daten benötigt
        Dim head As String = String.Format(&quot;--{0}&quot;, gui)
        Dim foot As String = String.Format(&quot;--{0}--&quot;, gui)

        &#039;Einen Stringbuilder erstellen, in dem wir nun bequem die
        &#039;benötigten POST Daten speichern können
        Dim contents As StringBuilder = New StringBuilder()

        &#039;Benutzerdaten schreiben (benutzername)
        contents.AppendLine(head)
        contents.AppendLine(String.Format(&quot;Content-Disposition: form-data; name=&quot;&quot;{0}&quot;&quot;&quot;, &quot;username&quot;))
        contents.AppendLine()
        contents.AppendLine(user)

        &#039;Benutzerdaten schreiben (passwort)
        contents.AppendLine(head)
        contents.AppendLine(String.Format(&quot;Content-Disposition: form-data; name=&quot;&quot;{0}&quot;&quot;&quot;, &quot;password&quot;))
        contents.AppendLine()
        contents.AppendLine(pass)

        &#039;Header schreiben
        contents.AppendLine(head)
        &#039;Bildinformationen schreiben, Bildkopf und die Binärdaten
        Dim fileHeader As String = String.Format(&quot;Content-Disposition: file; name=&quot;&quot;{0}&quot;&quot;; filename=&quot;&quot;{1}&quot;&quot;&quot;, &quot;media&quot;, filename)
        Dim fileData As String = System.Text.Encoding.GetEncoding(encoding).GetString(pic)

        &#039;Informationen zu dem Übergebenen Dateityp schreiben
        contents.AppendLine(fileHeader)
        contents.AppendLine(String.Format(&quot;Content-Type: {0}&quot;, &quot;image/jpeg&quot;))
        contents.AppendLine()
        contents.AppendLine(fileData)

        &#039;Durch schreiben des footers signalisieren dass keine Daten mehr kommen
        contents.AppendLine(foot)

        MessageBox.Show(contents.ToString)

        &#039;Stream Reader zum lesen der Antwort von Twitpic
        Dim reader As StreamReader
        Dim result As String
        Dim response As HttpWebResponse

        &#039;Einen Webrequest zu der TwitPic API erstellen
        Dim request As HttpWebRequest = WebRequest.Create(&quot;http://twitpic.com/api/upload&quot;)

        &#039;Die Auflagen die in der API beschreiben sind erfüllen:
        &#039;API-Zitat:
        &#039;---
        &#039;Fields to post in:
        &#039;(post data should be formatted as multipart/form-data)
        &#039;---
        request.ContentType = String.Format(&quot;multipart/form-data; boundary={0}&quot;, gui)
        request.Method = &quot;POST&quot;

        &#039;Die Daten die noch im Stringbuilder als String vorliegen
        &#039;in das byte (Binär)-Format umwandeln, damit die API diese annimt
        Dim bytes As Byte() = System.Text.Encoding.GetEncoding(encoding).GetBytes(contents.ToString())
        request.ContentLength = bytes.Length

        &#039;Einen Stream aus dem WebRequest erstellen
        Dim writer As Stream = request.GetRequestStream()

        &#039;Die Binären Daten in den Strom schreiben
        writer.Write(bytes, 0, bytes.Length)
        response = request.GetResponse()

        &#039;Antwort von Twitpic empfangen
        reader = New StreamReader(response.GetResponseStream)
        result = reader.ReadToEnd

        reader.Close()

        Return result
    End Function
</pre>
</pre>
<p><a href="http://blog.bigbasti.com/uploads/bild1.png"><img class="alignleft size-full wp-image-430" title="bild1" src="http://blog.bigbasti.com/uploads/bild1.png" alt="bild1" width="340" height="349" /></a>Wenn ihr diesen Code ausführt, wird ein POST-Objekt erzeugt und an den TwitPic Server gesendet. Dabei werden diese Informationen übermittelt. (Bild 1)</p>
<p>Man sieht ganz klar die Aufteilung. Der Kopf der aus der UID und den Meta Daten besteht und der Body, der nur den Wert beinhaltet.</p>
<p>Das Bild das ich hier sende hat einen etwas größeren Kopf, scheint dafür aber einen sehr kleinen Body zu haben. Ich kann euch beruhigen, das ist nur so, weil Windows, oder das MessageBox Objekt keine Binäre Darstellung von Zeichen beherrscht.</p>
<p>Eigentlich kommt dadrunter noch ein Footer (Fuß), aber dieser wird wegen der binären Daten abgeschnitten!</p>
<p><a href="http://blog.bigbasti.com/uploads/bild2.png"><img class="alignleft size-full wp-image-431" title="bild2" src="http://blog.bigbasti.com/uploads/bild2.png" alt="bild2" width="469" height="259" /></a>Natürlich bekommt man auch eine Antwort, in diesem Fall eine im XML-Format. Diese beinhaltet entweder die Erfolgsmeldung oder eine Fehlermeldung mit einer Kurzen Beschreibung, woran es lag. An Bild 2 könnt ihr erkennen wie so ein Fehler aussehen könnte!</p>
<p>Wenn kein Fehler kommt steht dort dementsprechend die URL zum Bild statt der Fehlermeldung!</p>
<p>Wenn ihr nicht direkt den Code versteht ist das nicht schlimm. Man sollte ersteinmal wissen was der Browser da bei jedem Klick eigentlich hin- und herschickt. Dazu kann ich den <a href="http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol" target="_self">Wikipedia-Artikel</a> empfehlen. Es schadet auch nicht, weitere Beispiele anzuschauen bei denen mit HTTPWebRequest gearbeitet wird. ZB <a href="http://www.code101.com/Code101/DisplayArticle.aspx?cid=82" target="_self">Hier </a>oder <a href="http://www.netomatix.com/httppostdata.aspx" target="_self">Hier</a>. (leider alles in C#)</p>
<p>Zum Schluss sei hier noch gesagt, dass die TwitPic API noch weitere Möglichkeiten bietet, wie zB. das Anfertigen von Vorschaubildern oder das Anhängen von Tweets an das Bild sodass automatisch auch euer Twitter Status mit dem neuen Bild aktualisiert wird!</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/bild3.png"><img class="aligncenter size-full wp-image-433" title="bild3" src="http://blog.bigbasti.com/uploads/bild3.png" alt="bild3" width="458" height="144" /></a><em>Bild 3: Das Demoprojekt in Aktion</em></p>
<p>Wie immer könnt ihr euch auch das Demoprojekt herunterladen: <a href="http://server.bigbasti.com/uploads/twitpicdemo.zip" target="_self">Download</a></p>
<p><strong>Ich hoffe das Beispiel hat euch gefallen und freue mich auf euer Feedback!</strong></p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=425&amp;md5=4487b6adc3ea690d805d406502e54584" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/vbnet-bilder-hochladen-mit-der-twitpic-api-teil-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>VB.NET: Kurze URLs erstellen mit bit.ly Teil 2</title>
		<link>http://blog.bigbasti.com/vbnet-kurze-urls-erstellen-mit-bitly-teil-2/</link>
		<comments>http://blog.bigbasti.com/vbnet-kurze-urls-erstellen-mit-bitly-teil-2/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 07:20:35 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[VB]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=406</guid>
		<description><![CDATA[Wie bereits im letzten Beitrag angekündigt möchte ich in diesem Beispiel zeigen, wie man seine URLs mit dem Dienst bit.ly verkürzen kann.

Ersteinmal die Frage "warum überhaupt bit.ly? Ich habe doch tinyurl.com!"

Nun das ist einfach, denn bit.ly bietet einen größeren Featureumfang. Dawäre:

	Eigene Accounts
	Linkmonitoring (wie oft wurde mein Link geklickt)
	Statistiken
	Erweiterte Abfragen und Parameter
	Kürzerer Name (bit.ly = ...]]></description>
			<content:encoded><![CDATA[<p>Wie bereits im letzten Beitrag angekündigt möchte ich in diesem Beispiel zeigen, wie man seine URLs mit dem Dienst <a href="http://www.bit.ly" target="_self">bit.ly</a> verkürzen kann.</p>
<p>Ersteinmal die Frage "warum überhaupt bit.ly? Ich habe doch tinyurl.com!"</p>
<p>Nun das ist einfach, denn bit.ly bietet einen größeren Featureumfang. Dawäre:</p>
<ul>
<li>Eigene Accounts</li>
<li>Linkmonitoring (wie oft wurde mein Link geklickt)</li>
<li>Statistiken</li>
<li>Erweiterte Abfragen und Parameter</li>
<li>Kürzerer Name (bit.ly = 6 Zeichen | tinyurl.com = 11 Zeichen)</li>
</ul>
<p>Allgemein kann man sagen, bit.ly ist professioneller aufgelegt! Aber mit einem höherem Featureumfang wird die Benutzung der APIs auch etwas komplexer.</p>
<p>An die API-Dokumentation von bit.ly kommt man sehr einfach in dem man auf deren Homepage ganz unten auf "API" klickt und dann dem gezeigten Link folgt. Hier findet man eine Komplette Dokumentation aller Möglichkeiten.</p>
<p>Was direkt auffällt ist, dass es viele verschiedene Funktionen gibt und die URL die wir benutzen müssen viel länger ist.</p>
<p>Das was aber auch sehr wichtig ist, ist dass man diesen Dienst nicht anonym benutzen kann, sondern sich einen Account erstellen muss um einen Sogenannten API-Key zu erhalten. Das ist hauptsächlich dafür da, um Missbrauch der Seite zu verhindern (zB. Spam).</p>
<p>Die Registrierung geht sehr schnell nach der Eingabe von Benutzername, E-Mail und Passwort. Wenn mann dann eingeloggt ist muss man folgende Seite aufrufen: <a href="http://bit.ly/account/your_api_key/" target="_self">http://bit.ly/account/your_api_key/</a> hier findet man seinen API-Schlüssel, den man unbedingt braucht, um URLs zu generieren, also aufschreiben!</p>
<p>ACHTUNG: In meinem Beispiel hier verwende ich den Demo-API-Schlüssel von bit.ly, der auch in der Doku steht. Wenn ihr was eigenes macht müsst ihr euch unbedingt registrieren!</p>
<p>Hat man das einmal geschafft kann man mit dem Programmieren loslegen:</p>
<pre>
<pre class="brush: vb.net; ">

    Public Function shortURL(ByVal langeURL As String)
        Dim retVal As String = &quot;&quot;

        &#039;Für dem API Aufruf wird benötigt:
        &#039;-&gt; Die Versionsnummer (version)
        &#039;-&gt; ein Benutzername (login)
        &#039;-&gt; ein API-Schlüssel (apiKey)

        &#039;Den API-Aufruf starten:
        Dim myRequest As WebRequest = WebRequest.Create _
            (&quot;http://api.bit.ly/shorten?&quot; &amp; _
            &quot;version=2.0.1&quot; &amp; _
            &quot;&amp;format=xml&quot; &amp; _
            &quot;&amp;longUrl=&quot; &amp; langeURL &amp; _
            &quot;&amp;login=bitlyapidemo&quot; &amp; _
            &quot;&amp;apiKey=R_0da49e0a9118ff35f52f629d2d71bf07&quot;)

        Dim myResponse As WebResponse = myRequest.GetResponse

        &#039;Den erzeugen Strom auslesen
        Dim myReader As StreamReader = _
                New StreamReader(myResponse.GetResponseStream)

        &#039;Stream auslesen
        retVal = myReader.ReadToEnd

        myReader.Close()

        Return retVal
    End Function
</pre>
</pre>
<p>Wie man sieht hat sich unser Code kaum verändert! Ich habe hier nur dem Link etwas angepasst, und um folgende Punkte erweitert:</p>
<ul>
<li>Version (Die Version der API, muss laut Doku mit angegeben werden!)</li>
<li>Format (Gibt das Format an, das für die Antwort verwendet werden soll)</li>
<li>Login (Der Benutzername von unserem Account)</li>
<li>APIKey (Der API-Schlüssel, den wir erhalten haben)</li>
<li>longURL (Und die zu kürzende URL)</li>
</ul>
<p>Was hier wichtig ist, ist das Format. Hier hat man die Wahl zwischen XML und "json", wobei ich euch XML empfehlen würde, da es einfach übersichtlicher und einfacher verwendbar ist!</p>
<p>Wenn wir nun einen Request mit diesem langen Link erstellen erhalten wir auch eine Antwort im XML oder json Format:</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/bitlydemo.jpg"><img class="aligncenter size-full wp-image-407" title="bitlydemo" src="http://blog.bigbasti.com/uploads/bitlydemo.jpg" alt="bitlydemo" width="652" height="326" /></a><em>Bild 1: Die zwei Rückgabetypen von bit.ly</em></p>
<p>Wie man sieht erhalten wir hier anders als bei tinyurl.com nicht direkt die kurze URL, sondern einen Haufen Informationen, wie Fehlercode, Fehlernachricht etc...</p>
<p>Uns interessiert aber natürlich nur die neue kurze URL, also müssen wir diese ersteinmal aus dem XML Durcheinander auslesen. Dazu habe ich diese Funktion erstellt:</p>
<pre>
<pre class="brush: vb.net; ">

    Public Function extractURL(ByVal response As String)
        &#039;Ein XML-Dokument anhand der Antword von bit.ly erstellen:
        Dim myDoc As New XmlDocument
        myDoc.LoadXml(response)

        &#039;Nun nehmen wir uns das Element raus, in dem die
        &#039;neue kurze URL steht:
        Return myDoc.SelectSingleNode(&quot;/bitly/results/nodeKeyVal/shortUrl&quot;).InnerText
    End Function
</pre>
</pre>
<p>Hier wird einfach nur ein XML-Dokument erzeugt (aus der Antwort) und dann der entsprechende Node ausgelesen!</p>
<p>Ein Hinweis noch: In der Doku wird weiterhin erwähnt, dass man nur ein bengenztes Kontingent an API-Aufrufen hat. Wenn man die API viel nutzen will sollte man sich bei bit.ly melden!</p>
<p>Auch hierzu habe ich ein Kleines Demoprogramm angefertigt:</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/bitlydemo2.jpg"><img class="aligncenter size-full wp-image-408" title="bitlydemo2" src="http://blog.bigbasti.com/uploads/bitlydemo2.jpg" alt="bitlydemo2" width="440" height="153" /></a><em>Bild 2: Der uRL-Kürzer in Aktion</em></p>
<p>Download Hier: <a href="http://blog.bigbasti.com/bitlydemoprijcet" target="_self">Download</a></p>
<p><strong>Hat euch der Beitrag gefallen? Ich freu mich auf euer Feedback!</strong></p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=406&amp;md5=91e6db6e2f45f1b76ddd63867c2a027a" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/vbnet-kurze-urls-erstellen-mit-bitly-teil-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TreeView in XML speichern und zurück einlesen #2</title>
		<link>http://blog.bigbasti.com/vb-treeview-in-xml-speichern-und-zuruck-einlesen-2/</link>
		<comments>http://blog.bigbasti.com/vb-treeview-in-xml-speichern-und-zuruck-einlesen-2/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 14:01:01 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=368</guid>
		<description><![CDATA[Vor ca 2 Wochen habe ich eine Hilfsklasse zum Exportieren und Importieren von TreeNodes und XMLDateien veröffentlicht, mit dem Versprechen auf ein Update, mit dem das Exportieren ganzer TreeViews möglich ist.

Jetzt hatte ich Zeit und habe die Klasse um die entsprechenden Funktionen erweitert, sodass es nun möglich ist einen ganzen Baum in einer XML ...]]></description>
			<content:encoded><![CDATA[<p>Vor ca 2 Wochen habe ich eine Hilfsklasse zum Exportieren und Importieren von TreeNodes und XMLDateien <a href="http://blog.bigbasti.com/vb-treeview-in-xml-speichern-und-zuruck-einlesen/" target="_self">veröffentlicht</a>, mit dem Versprechen auf ein Update, mit dem das Exportieren ganzer TreeViews möglich ist.</p>
<p>Jetzt hatte ich Zeit und habe die Klasse um die entsprechenden Funktionen erweitert, sodass es nun möglich ist einen ganzen Baum in einer XML Datei abzulegen.</p>
<p><a href="http://blog.bigbasti.com/uploads/treeviewdemo2.jpg"><img class="aligncenter size-full wp-image-369" title="treeviewdemo2" src="http://blog.bigbasti.com/uploads/treeviewdemo2.jpg" alt="treeviewdemo2" width="609" height="116" /></a></p>
<p>Warum habe ich das nicht gleich so gemacht? Ganz einfach weil ich das nicht brauchte! <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Und es eigentlich sinnvoller finde die TreeNodes einzeln zu speichern!</p>
<p>Außerdem besteht beim Speichern einer TreeView ein großes Problem! Ansich eignet sich die Struktur einer TreeView perfekt um diese in einer XML Datei abzubilden. Nun kommt aber das Problem ins Spiel, dass eine TreeView mehrere "Kern" (root)-Äßte haben kann. Einer XML erlaubt das aber nicht. Eine XML Datei darf exakt eine Root-Node besitzen!</p>
<p><a href="http://blog.bigbasti.com/uploads/treeviewdemo2_1.jpg"><img class="aligncenter size-full wp-image-370" title="treeviewdemo2_1" src="http://blog.bigbasti.com/uploads/treeviewdemo2_1.jpg" alt="treeviewdemo2_1" width="551" height="272" /></a></p>
<p>Wie umgeht man nun dieses Problem? Ich habe das so geregelt, dass ich einfach eine eigene Root-Node erstelle in die ich dann die Root-Nodes aus der TreeView einfüge die exportiert werden soll. Diese habe ich dementsprechend "rootNode" genannt! Also nicht erschrecken, wenn ihr in euren XML Files diese Fremde Node findet, diese wird beim Einlesen natürlich nicht mit eingelesen!</p>
<p>Ansonsten ähneld der neue Code sehr dem alten. Wie immer könnt ihr mir gerne Kommentare mit Bugs, Fehlern und Wünschen schreiben. Viel Spaß beim Testen und benutzen! Ich habe die Klasse wie auch letztes mal in ein Demoprojekt verpackt damit man die neuen Funktionen gleich live erleben kann! Wenn ihr nur auf die Klasse scharf seit, dann kopiert sie einfach aus dem Projektordner in euer eigenes Projekt!</p>
<p>Bei Weiteren Fragen schreibt mir bitte eine Mail!</p>
<p>Download: <a href="http://blog.bigbasti.com/xmlParserDemo2" target="_self">XMLParser v. 1.1</a></p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=368&amp;md5=9a614709c515bf54a256dd43e1442783" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/vb-treeview-in-xml-speichern-und-zuruck-einlesen-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VB: TreeView in XML speichern und zurück einlesen</title>
		<link>http://blog.bigbasti.com/vb-treeview-in-xml-speichern-und-zuruck-einlesen/</link>
		<comments>http://blog.bigbasti.com/vb-treeview-in-xml-speichern-und-zuruck-einlesen/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 07:31:59 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=331</guid>
		<description><![CDATA[Als eine kleine Ergänzung zu der "Ordnerstrukturen einlesen" Serie möchte ich hier eine Möglichkeit zeigen, wie man TreeViews als XML Dateien serialisieren kann.

TreeViews sind ja nichts anderes als Ordner-Bäume. Diese Struktur eignet sich natürlich sehr für XML. Das .NET Framework bietet hier einige sehr bequeme Möglichkeiten um XML Dateien zu erzeugen, zu bearbeiten und ...]]></description>
			<content:encoded><![CDATA[<p>Als eine kleine Ergänzung zu der "Ordnerstrukturen einlesen" Serie möchte ich hier eine Möglichkeit zeigen, wie man TreeViews als XML Dateien serialisieren kann.</p>
<p>TreeViews sind ja nichts anderes als Ordner-Bäume. Diese Struktur eignet sich natürlich sehr für XML. Das .NET Framework bietet hier einige sehr bequeme Möglichkeiten um XML Dateien zu erzeugen, zu bearbeiten und einzulesen!</p>
<p>Um das zu demonstrieren habe ich eine VB.NET Klasse angefertigt, die diese Aufgaben für uns übernimmt, also das Abspeichern einer TreeView in einer XML Datei und auch das einlesen eines XML-Baums in eine TreeView.</p>
<p><a href="http://blog.bigbasti.com/uploads/xmlparser.jpg"><img class="aligncenter size-full wp-image-332" title="xmlparser" src="http://blog.bigbasti.com/uploads/xmlparser.jpg" alt="xmlparser" width="478" height="123" /></a></p>
<p>Die Klasseheißt XMLParser und bietet zur Zeit genau 2 Funktionen nämlich zum Exportiren und Importieren von TreeNodes.</p>
<p>Ihr könnt diese Klasse sehr einach in euer eigenes Projekt Importiren und gleich loslegen! Dazu einfach im Projektmappen-Explorer auf euer Projekt rechtsklicken und über "Hinzufügen"-&gt;"Klasse" die XMLParser Klasse hinzufügen.</p>
<p>Ich habe die Anwendung möglichst einfach gehalten, sodass alle Aufrufe maximal eine Zeile in Anspruch nehmen:</p>
<p><a href="http://blog.bigbasti.com/uploads/xmlparser2.jpg"><img class="aligncenter size-full wp-image-333" title="xmlparser2" src="http://blog.bigbasti.com/uploads/xmlparser2.jpg" alt="xmlparser2" width="666" height="56" /></a></p>
<p>Wie man sieht ist die Benutzung sehr einfach gehalten. Desweiteren kann man in dieser Version "nur" TreeNodes abspeichern, will man also eine Komplette TreeView abspeichern muss man mit eine Schleife alle Root-Nodes durchlaufen!</p>
<p>Natürlich können auch XML-Dateien eingelesen werden, die nicht vom XMLParser erzeugt wurden, wie zum Beispiel Config-Dateien oder "richtige" XML-Dateien!</p>
<p>Ich werde mit der Zeit die Funktionalität der Klasse erweitern, sodass auch ganze TreeViews gespeichert und eingelesen werden können. Und auch Merging (deu: Vereinigen) und Synchronisieren wird möglich sein!</p>
<p>Desweiteren werden ich weitere Überladungen einbauen, sodass die Funktionen weiterhin so übersichtlich sein werden!</p>
<p>Wenn ihr Interesse habt könnt ihr euch hier ein Demoprojekt inklusive der Klasse herunterladen.</p>
<p>Dieses Demoprojekt herunterladen: <a href="http://blog.bigbasti.com/xmlParserDemo" target="_blank">Download</a></p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=331&amp;md5=e660686258c1106dd78f92703b024faf" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/vb-treeview-in-xml-speichern-und-zuruck-einlesen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

