<?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>Tiago Salgado &#187; C#</title>
	<atom:link href="http://blog.tiagosalgado.com/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tiagosalgado.com</link>
	<description>personal blog</description>
	<lastBuildDate>Sat, 21 Jan 2012 15:20:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>C# Yellow Book 2011</title>
		<link>http://blog.tiagosalgado.com/2011/10/16/c-yellow-book-2011/</link>
		<comments>http://blog.tiagosalgado.com/2011/10/16/c-yellow-book-2011/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 20:38:43 +0000</pubDate>
		<dc:creator>Tiago Salgado</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[ebooks]]></category>

		<guid isPermaLink="false">http://blog.tiagosalgado.com/?p=1166</guid>
		<description><![CDATA[O Rob Miles fez uma actualização ao seu já bem conhecido C# Yellow Book. Download]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="chsarp_yellow_book" src="http://img69.imageshack.us/img69/7775/csharpyellow.png" alt="" width="315" height="215" /></p>
<p>O <a href="http://www.robmiles.com" target="_blank">Rob Miles</a> fez uma actualização ao seu já bem conhecido C# Yellow Book.</p>
<p><a href="http://www.robmiles.com/c-yellow-book/Rob%20Miles%20CSharp%20Yellow%20Book%202011.pdf" target="_blank">Download</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tiagosalgado.com/2011/10/16/c-yellow-book-2011/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Controlar Menus visiveis com o web.sitemap</title>
		<link>http://blog.tiagosalgado.com/2011/04/14/controlar-menus-visiveis-com-o-web-sitemap/</link>
		<comments>http://blog.tiagosalgado.com/2011/04/14/controlar-menus-visiveis-com-o-web-sitemap/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 12:52:21 +0000</pubDate>
		<dc:creator>Tiago Salgado</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.tiagosalgado.com/controlar-menus-visiveis-com-o-web-sitemap/</guid>
		<description><![CDATA[Uma maneira rápida de ter um menu a funcionar no nosso website, é recorrer ao controlo Menu e associá-lo a um web.sitemap usando o SiteMapDataSource. Exemplo do ficheiro web.sitemap: &#60;?xml version="1.0" encoding="utf-8" ?&#62; &#60;siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" &#62;     &#60;siteMapNode  url="~/" title="Home"  description="Home" &#62;         &#60;siteMapNode url="" description="Menu 1" title="Menu 1"&#62;             &#60;siteMapNode url="" description="SubMenu 1" title="Sub Menu 1"/&#62;         &#60;/siteMapNode&#62;         &#60;siteMapNode url="" description="Menu 2" title="Menu 2"/&#62;         &#60;siteMapNode url="" description="Menu 3" title="Menu 3"/&#62;     &#60;/siteMapNode&#62; &#60;/siteMap&#62; Exemplo do código para adicionar na página o menu: &#60;asp:Menu ID="NavigationMenu" runat="server" CssClass="menu"      EnableViewState="False" IncludeStyleBlock="False" Orientation="Horizontal"      DataSourceID="SiteMapDataSource1" onmenuitemdatabound="NavigationMenu_MenuItemDataBound"&#62; &#60;/asp:Menu&#62; &#60;asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server"  ShowStartingNode="false" /&#62; Correndo a]]></description>
			<content:encoded><![CDATA[<p>Uma maneira rápida de ter um menu a funcionar no nosso website, é recorrer ao controlo Menu e associá-lo a um web.sitemap usando o SiteMapDataSource.</p>
<p>Exemplo do ficheiro web.sitemap:</p>
<pre>&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" &gt;
    &lt;siteMapNode  url="~/" title="Home"  description="Home" &gt;
        &lt;siteMapNode url="" description="Menu 1" title="Menu 1"&gt;
            &lt;siteMapNode url="" description="SubMenu 1" title="Sub Menu 1"/&gt;
        &lt;/siteMapNode&gt;
        &lt;siteMapNode url="" description="Menu 2" title="Menu 2"/&gt;
        &lt;siteMapNode url="" description="Menu 3" title="Menu 3"/&gt;
    &lt;/siteMapNode&gt;
&lt;/siteMap&gt;</pre>
<p>Exemplo do código para adicionar na página o menu:</p>
<pre>
<pre>&lt;asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" 
    EnableViewState="False" IncludeStyleBlock="False" Orientation="Horizontal" 
    DataSourceID="SiteMapDataSource1" onmenuitemdatabound="NavigationMenu_MenuItemDataBound"&gt;
&lt;/asp:Menu&gt;
&lt;asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server"  ShowStartingNode="false" /&gt;</pre>
</pre>
<p>Correndo a aplicação, iremos ter algo como a próxima imagem:</p>
<p><img src="http://img576.imageshack.us/img576/1593/menu1rc.png" alt="" width="454" height="143" /></p>
<p>Para mostrar ou esconder os menus, consoante o tipo de acesso de cada utilizador, podemos definir as Roles em cada SiteMapNode.</p>
<p>Outra forma de controlar os menus visiveis, é adicionar um atributo em cada SiteMapNode e consoante o seu valor, irá ou não mostrar cada um dos menus.</p>
<p>Para isso, o web.sitemap será algo como:</p>
<pre>
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"&gt;
  &lt;siteMapNode url="~/" title="Home" description="Home" visible="true"&gt;
    &lt;siteMapNode url="" description="Menu 1" title="Menu 1" visible="true"&gt;
      &lt;siteMapNode url="" description="SubMenu 1" title="Sub Menu 1" visible="true" /&gt;
    &lt;/siteMapNode&gt;
    &lt;siteMapNode url="" description="Menu 2" title="Menu 2" visible="False" /&gt;
    &lt;siteMapNode url="" description="Menu 3" title="Menu 3" visible="true" /&gt;
  &lt;/siteMapNode&gt;
&lt;/siteMap&gt;</pre>
</pre>
<p>O atributo “visible” é que nos vai indicar se o menu é ou não mostrado, e para isso vamos adicionar ao evento MenuItemDataBound do Menu o seguinte código:</p>
<pre>
<pre>protected void NavigationMenu_MenuItemDataBound(object sender, MenuEventArgs e)
{
    SiteMapNode node = e.Item.DataItem as SiteMapNode;
    if (!string.IsNullOrEmpty(node["visible"]))
    {
        bool isVisible;
        if (bool.TryParse(node["visible"], out isVisible))
        {
            if (!isVisible)
            {
                if (e.Item.Parent != null)
                    e.Item.Parent.ChildItems.Remove(e.Item);
                else
                    ((Menu)sender).Items.Remove(e.Item);
            }
        }
    }
}</pre>
</pre>
<p>Desta forma, teremos o nosso menu a mostrar todos os nós cujo valor do atributo Visible seja igual a True.</p>
<p>Para podermos controlar directamente os menus que irão estar ou não visiveis, utilizei uma Treeview para carregar o ficheiro web.sitemap, definir que todos os items mostrarão uma checkbox, que irá indicar o estado do atributo Visible.</p>
<pre>
<pre>&lt;asp:TreeView runat="server" ID="tvMenus" AutoGenerateDataBindings="False" DataSourceID="XmlDsSiteMap"
    OnTreeNodeCheckChanged="tvMenus_TreeNodeCheckChanged" ShowCheckBoxes="All" ShowLines="True"
    OnTreeNodeDataBound="tvMenus_TreeNodeDataBound"&gt;
    &lt;DataBindings&gt;
        &lt;asp:TreeNodeBinding DataMember="siteMapNode" SelectAction="None" ShowCheckBox="True"
            TextField="title" /&gt;
        &lt;asp:TreeNodeBinding DataMember="siteMapNode" TextField="title" /&gt;
        &lt;asp:TreeNodeBinding DataMember="siteMapNode" TextField="title" /&gt;
        &lt;asp:TreeNodeBinding DataMember="siteMap" /&gt;
    &lt;/DataBindings&gt;
&lt;/asp:TreeView&gt;
&lt;asp:XmlDataSource ID="XmlDsSiteMap" runat="server" DataFile="~/Web.sitemap" XPath="/*/*/*"&gt;
&lt;/asp:XmlDataSource&gt;
    &lt;p&gt;
        &lt;asp:Button runat="server" ID="btn" Text="gravar" OnClick="btn_Click" /&gt;&lt;/p&gt;</pre>
</pre>
<p>&nbsp;</p>
<pre>
<pre>protected void tvMenus_TreeNodeDataBound(object sender, TreeNodeEventArgs e)
{
    XmlElement node = e.Node.DataItem as XmlElement;
    if (node.Attributes["visible"] != null)
    {
        if (!string.IsNullOrEmpty(node.Attributes["visible"].Value))
        {
            bool isVisible;
            if (bool.TryParse(node.Attributes["visible"].Value, out isVisible))
            {
                e.Node.Checked = isVisible;
            }
            else
                e.Node.Checked = true;
        }
        else
            e.Node.Checked = true;
    }
}</pre>
</pre>
<p><img src="http://img828.imageshack.us/img828/8241/menu2f.png" alt="" width="396" height="276" /></p>
<p>Por fim, para gravarmos as alterações do atributo consoante o estado da checkbox, adicionamos ao evento TreeNodeCheckChanged da Treeview o seguinte código:</p>
<pre>
<pre>protected void tvMenus_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
{
    XmlDsSiteMap.GetXmlDocument().SelectSingleNode(e.Node.DataPath).Attributes["visible"].Value = e.Node.Checked.ToString();
}</pre>
</pre>
<p>E ao botão que adicionamos para gravar as alterações o seguinte código:</p>
<pre>
<pre>protected void btn_Click(object sender, EventArgs e)
{
    XmlDsSiteMap.Save();
}</pre>
</pre>
<p>Agora é só activar e desactivar os items ao nosso gosto.</p>
<p><img src="http://img828.imageshack.us/img828/543/menu3x.png" alt="" width="356" height="271" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tiagosalgado.com/2011/04/14/controlar-menus-visiveis-com-o-web-sitemap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instaladores Habilitados de TDT por Código Postal (JSON + C#)</title>
		<link>http://blog.tiagosalgado.com/2011/04/01/instaladores-habilitados-de-tdt-por-cdigo-postal-json-c/</link>
		<comments>http://blog.tiagosalgado.com/2011/04/01/instaladores-habilitados-de-tdt-por-cdigo-postal-json-c/#comments</comments>
		<pubDate>Fri, 01 Apr 2011 17:30:00 +0000</pubDate>
		<dc:creator>Tiago Salgado</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[dev]]></category>

		<guid isPermaLink="false">http://blog.tiagosalgado.com/instaladores-habilitados-de-tdt-por-cdigo-postal-json-c/</guid>
		<description><![CDATA[Pois é, a TDT já anda aí, e por razões que não interessam, precisei de retornar todos os instaladores por cada código postal, cuja PT indica como sendo um instalador habilitado. Para tal, fiz uma pequena aplicação que enviada um pedido com o código postal, e interpretava o resultado retornado em JSON. Primeiro tive que]]></description>
			<content:encoded><![CDATA[<p>Pois é, a TDT já anda aí, e por razões que não interessam, precisei de retornar todos os instaladores por cada código postal, cuja PT indica como sendo um instalador habilitado.</p>
<p>Para tal, fiz uma pequena aplicação que enviada um pedido com o código postal, e interpretava o resultado retornado em JSON.</p>
<p>Primeiro tive que criar um ficheiro de texto com todos os códigos postais. Podem fazer download do que usei <a href="http://www.box.net/shared/hn52rj4h38" target="_blank">aqui</a>.</p>
<p>O código poderá não ser o melhor, mas fez o que pretendia e não precisei de me chatear mais com o assunto.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d60490cc-6ec5-4f42-a36b-2621f06e335e" class="wlWriterEditableSmartContent">
<pre name="code" class="c">using System;
using System.Collections.Generic;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;

namespace WebApplication1
{
    public class CPs
    {
        public string cp4 { get; set; }
        public string cp3 { get; set; }
    }

    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            GetData();
        }

        private void GetData()
        {
            List&lt;CPs&gt; cps = new List&lt;CPs&gt;();

            TextReader t = new StreamReader(@"C:cps.txt");
            string line = "";
            t.ReadLine();
            while (t.Peek() &gt; 0)
            {
                line = t.ReadLine();
                cps.Add(new CPs() { cp4 = line.Split('-')[0].ToString(), cp3 = line.Split('-')[1].ToString() });
            }

            HttpWebRequest request = null;

            foreach (CPs cp in cps)
            {
                try
                {
                    request = (HttpWebRequest)HttpWebRequest.Create(@"http://tdt.telecom.pt/handlers/installerSearch.ashx?cp4=" + cp.cp4 + "&amp;cp3=" + cp.cp3);
                    request.ContentType = "application/json; charset=utf-8";
                    request.Accept = "application/json, text/javascript, */*";
                    WebResponse response = request.GetResponse();

                    Stream stream = response.GetResponseStream();
                    string json = "";

                    using (StreamReader reader = new StreamReader(stream))
                    {
                        while (!reader.EndOfStream)
                        {
                            json += reader.ReadLine();
                        }
                    }

                    JavaScriptSerializer serializer = new JavaScriptSerializer();
                    Dictionary&lt;string, object&gt; x = (Dictionary&lt;string, object&gt;)serializer.DeserializeObject(json);

                    if (x.Count &gt; 0)
                        Response.Write(cp.cp4 + ";" + cp.cp3 + ";" + x["name"].ToString() + ";" + x["phoneNumber1"].ToString() + ";" + x["phoneNumber2"].ToString() + "&lt;br /&gt;");

                }
                catch (Exception)
                {

                }

            }
        }

    }

}</pre>
</div>
<p><!-- Start block. Created with Code4Blog for Microsoft Visual Studio 2010. Copyright (c)2010 Vitaly Zayko http://zayko.net --><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #a31515"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #a5c25c"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #a31515"><span style="color: #ffffff"><span style="color: #a5c25c"><span style="color: #ffffff"><span style="color: #a5c25c"><span style="color: #ffffff"><span style="color: #a5c25c"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #a5c25c"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #a5c25c"><span style="color: #ffffff"><span style="color: #a5c25c"><span style="color: #ffffff"><span style="color: #a5c25c"><span style="color: #ffffff"><span style="color: #a5c25c"><span style="color: #ffffff"><span style="color: #a5c25c"><span style="color: #ffffff"><span style="color: #a5c25c"><span style="color: #ffffff"><span style="color: #a5c25c"><span style="color: #ffffff"><span style="color: #a5c25c"><span style="color: #ffffff"><span style="color: #cc7832"><span style="color: #ffffff"><span style="color: #ffc66d"><span style="color: #ffffff"><!-- End block --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tiagosalgado.com/2011/04/01/instaladores-habilitados-de-tdt-por-cdigo-postal-json-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criar um ficheiro Zip em C#</title>
		<link>http://blog.tiagosalgado.com/2011/03/03/criar-um-ficheiro-zip-em-c/</link>
		<comments>http://blog.tiagosalgado.com/2011/03/03/criar-um-ficheiro-zip-em-c/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 17:33:01 +0000</pubDate>
		<dc:creator>Tiago Salgado</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.tiagosalgado.com/?p=664</guid>
		<description><![CDATA[Uma forma rápida de criarmos um ficheiro Zip, é recorrendo à classe ZipPackage do WindowsBase.dll. Para tal, precisamos de adicionar a referencia a esta dll ao nosso projecto, que no meu caso está em &#8220;C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.0ProfileClientWindowsBase.dll&#8221;. Podemos criar agora uma classe com um método para criar o ficheiro Zip com os ficheiros que]]></description>
			<content:encoded><![CDATA[<p>Uma forma rápida de criarmos um ficheiro Zip, é recorrendo à classe ZipPackage do WindowsBase.dll.</p>
<p>Para tal, precisamos de adicionar a referencia a esta dll ao nosso projecto, que no meu caso está em &#8220;C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.0ProfileClientWindowsBase.dll&#8221;.</p>
<p>Podemos criar agora uma classe com um método para criar o ficheiro Zip com os ficheiros que queremos.</p>
<pre style="color: #000000; background: #ffffff;"><span style="color: #800000; font-weight: bold;">public</span> <span style="color: #800000; font-weight: bold;">static</span> <span style="color: #800000; font-weight: bold;">void</span> CreateZipFile<span style="color: #808030;">(</span><span style="color: #800000; font-weight: bold;">string</span> zipFilename<span style="color: #808030;">,</span> List<span style="color: #808030;">&lt;</span><span style="color: #800000; font-weight: bold;">string</span><span style="color: #808030;">&gt;</span> files<span style="color: #808030;">,</span> CompressionOption compression<span style="color: #808030;">,</span> <span style="color: #800000; font-weight: bold;">bool</span> deleteFilesAfterZip<span style="color: #808030;">)</span>
        <span style="color: #800080;">{</span>
            <span style="color: #800000; font-weight: bold;">long</span> bsize <span style="color: #808030;">=</span> <span style="color: #008c00;">4096</span><span style="color: #800080;">;</span>
            <span style="color: #800000; font-weight: bold;">byte</span><span style="color: #808030;">[</span><span style="color: #808030;">]</span> b <span style="color: #808030;">=</span> <span style="color: #800000; font-weight: bold;">new</span> <span style="color: #800000; font-weight: bold;">byte</span><span style="color: #808030;">[</span>bsize<span style="color: #808030;">]</span><span style="color: #800080;">;</span>
            <span style="color: #800000; font-weight: bold;">int</span> bytesRead <span style="color: #808030;">=</span> <span style="color: #008c00;">0</span><span style="color: #800080;">;</span>
            <span style="color: #800000; font-weight: bold;">long</span> bytesWritten <span style="color: #808030;">=</span> <span style="color: #008c00;">0</span><span style="color: #800080;">;</span>
            <span style="color: #800000; font-weight: bold;">using</span> <span style="color: #808030;">(</span>Package zip <span style="color: #808030;">=</span> System<span style="color: #808030;">.</span>IO<span style="color: #808030;">.</span>Packaging<span style="color: #808030;">.</span>Package<span style="color: #808030;">.</span>Open<span style="color: #808030;">(</span>zipFilename<span style="color: #808030;">,</span> FileMode<span style="color: #808030;">.</span>OpenOrCreate<span style="color: #808030;">)</span><span style="color: #808030;">)</span>
            <span style="color: #800080;">{</span>
                <span style="color: #800000; font-weight: bold;">foreach</span> <span style="color: #808030;">(</span><span style="color: #800000; font-weight: bold;">string</span> file <span style="color: #800000; font-weight: bold;">in</span> files<span style="color: #808030;">)</span>
                <span style="color: #800080;">{</span>
                    Uri uri <span style="color: #808030;">=</span> PackUriHelper<span style="color: #808030;">.</span>CreatePartUri<span style="color: #808030;">(</span><span style="color: #800000; font-weight: bold;">new</span> Uri<span style="color: #808030;">(</span>file<span style="color: #808030;">,</span> UriKind<span style="color: #808030;">.</span>Absolute<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span>
                    <span style="color: #800000; font-weight: bold;">if</span> <span style="color: #808030;">(</span>zip<span style="color: #808030;">.</span>PartExists<span style="color: #808030;">(</span>uri<span style="color: #808030;">)</span><span style="color: #808030;">)</span>
                        zip<span style="color: #808030;">.</span>DeletePart<span style="color: #808030;">(</span>uri<span style="color: #808030;">)</span><span style="color: #800080;">;</span>

                    PackagePart part <span style="color: #808030;">=</span> zip<span style="color: #808030;">.</span>CreatePart<span style="color: #808030;">(</span>uri<span style="color: #808030;">,</span> <span style="color: #800000;">"</span><span style="color: #800000;">"</span><span style="color: #808030;">,</span> compression<span style="color: #808030;">)</span><span style="color: #800080;">;</span>
                    <span style="color: #800000; font-weight: bold;">using</span> <span style="color: #808030;">(</span>FileStream stream <span style="color: #808030;">=</span> <span style="color: #800000; font-weight: bold;">new</span> FileStream<span style="color: #808030;">(</span>file<span style="color: #808030;">,</span> FileMode<span style="color: #808030;">.</span>Open<span style="color: #808030;">,</span> FileAccess<span style="color: #808030;">.</span>Read<span style="color: #808030;">)</span><span style="color: #808030;">)</span>
                    <span style="color: #800080;">{</span>
                        <span style="color: #800000; font-weight: bold;">using</span> <span style="color: #808030;">(</span>Stream dest <span style="color: #808030;">=</span> part<span style="color: #808030;">.</span>GetStream<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span>
                        <span style="color: #800080;">{</span>
                            <span style="color: #800000; font-weight: bold;">while</span> <span style="color: #808030;">(</span><span style="color: #808030;">(</span>bytesRead <span style="color: #808030;">=</span> stream<span style="color: #808030;">.</span>Read<span style="color: #808030;">(</span>b<span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> b<span style="color: #808030;">.</span>Length<span style="color: #808030;">)</span><span style="color: #808030;">)</span> <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #008c00;">0</span><span style="color: #808030;">)</span>
                            <span style="color: #800080;">{</span>
                                dest<span style="color: #808030;">.</span>Write<span style="color: #808030;">(</span>b<span style="color: #808030;">,</span> <span style="color: #008c00;">0</span><span style="color: #808030;">,</span> bytesRead<span style="color: #808030;">)</span><span style="color: #800080;">;</span>
                                bytesWritten <span style="color: #808030;">+</span><span style="color: #808030;">=</span> bsize<span style="color: #800080;">;</span>
                            <span style="color: #800080;">}</span>
                        <span style="color: #800080;">}</span>
                    <span style="color: #800080;">}</span>
                <span style="color: #800080;">}</span>

            <span style="color: #800080;">}</span>

            <span style="color: #800000; font-weight: bold;">if</span> <span style="color: #808030;">(</span>deleteFilesAfterZip<span style="color: #808030;">)</span>
                DeleteFiles<span style="color: #808030;">(</span>files<span style="color: #808030;">)</span><span style="color: #800080;">;</span>
        <span style="color: #800080;">}</span>
</pre>
<p>Adicionei um parametro (deleteFilesAfterZip) que vai remover todos os ficheiros que foram incluidos no Zip, apenas para me facilitar o trabalho, mas não é obrigatório.</p>
<p>A função DeleteFiles() será algo parecido com isto:</p>
<pre style="color: #000000; background: #ffffff;"><span style="color: #800000; font-weight: bold;">private</span> <span style="color: #800000; font-weight: bold;">static</span> <span style="color: #800000; font-weight: bold;">void</span> DeleteFiles<span style="color: #808030;">(</span>List<span style="color: #808030;">&lt;</span><span style="color: #800000; font-weight: bold;">string</span><span style="color: #808030;">&gt;</span> files<span style="color: #808030;">)</span>
        <span style="color: #800080;">{</span>
            <span style="color: #800000; font-weight: bold;">foreach</span> <span style="color: #808030;">(</span><span style="color: #800000; font-weight: bold;">string</span> file <span style="color: #800000; font-weight: bold;">in</span> files<span style="color: #808030;">)</span>
            <span style="color: #800080;">{</span>
                FileInfo f <span style="color: #808030;">=</span> <span style="color: #800000; font-weight: bold;">new</span> FileInfo<span style="color: #808030;">(</span>file<span style="color: #808030;">)</span><span style="color: #800080;">;</span>
                <span style="color: #800000; font-weight: bold;">if</span> <span style="color: #808030;">(</span><span style="color: #808030;">!</span>f<span style="color: #808030;">.</span>Exists<span style="color: #808030;">)</span>
                    <span style="color: #800000; font-weight: bold;">throw</span> <span style="color: #800000; font-weight: bold;">new</span> FileNotFoundException<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span>

                f<span style="color: #808030;">.</span>Delete<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span>
            <span style="color: #800080;">}</span>
        <span style="color: #800080;">}</span>
</pre>
<p>Por fim, para chamarmos a função que cria o ficheiro Zip basta um simples</p>
<pre style="color: #000000; background: #ffffff;">ZIP<span style="color: #808030;">.</span>CreateZipFile<span style="color: #808030;">(</span><span style="color: #800000;">"</span><span style="color: #0000e6;">c:\xpto.zip</span><span style="color: #800000;">"</span><span style="color: #808030;">,</span> <span style="color: #800000; font-weight: bold;">new</span> List<span style="color: #808030;">&lt;</span><span style="color: #800000; font-weight: bold;">string</span><span style="color: #808030;">&gt;</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span> <span style="color: #800080;">{</span> <span style="color: #800000;">"</span><span style="color: #0000e6;">c:\xpto.txt</span><span style="color: #800000;">"</span><span style="color: #808030;">,</span> <span style="color: #800000;">"</span><span style="color: #0000e6;">c:\xpto1.txt</span><span style="color: #800000;">"</span> <span style="color: #800080;">}</span><span style="color: #808030;">,</span> System<span style="color: #808030;">.</span>IO<span style="color: #808030;">.</span>Packaging<span style="color: #808030;">.</span>CompressionOption<span style="color: #808030;">.</span>Normal<span style="color: #808030;">,</span> <span style="color: #800000; font-weight: bold;">false</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span>
</pre>
<p>Referências:</p>
<p><a href="http://msdn.microsoft.com/en-us/library/system.io.packaging.aspx" target="_blank">http://msdn.microsoft.com/en-us/library/system.io.packaging.aspx</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx" target="_blank">http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx</a></p>
<p><a href="http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx" target="_blank">http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tiagosalgado.com/2011/03/03/criar-um-ficheiro-zip-em-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>NBlog : ASP.NET MVC 3.0 Blog Engine</title>
		<link>http://blog.tiagosalgado.com/2011/02/26/nblog-asp-net-mvc-3-0-blog-engine/</link>
		<comments>http://blog.tiagosalgado.com/2011/02/26/nblog-asp-net-mvc-3-0-blog-engine/#comments</comments>
		<pubDate>Sat, 26 Feb 2011 14:54:09 +0000</pubDate>
		<dc:creator>Tiago Salgado</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[codeplex]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://blog.tiagosalgado.com/nblog-asp-net-mvc-3-0-blog-engine/</guid>
		<description><![CDATA[O NLog é um sistema de blogs desenvolvido em ASP.NET MVC 3, Razor, JQuery e C#. Podem ver em funcionamento em http://chrisfulstow.com/ ou http://blog.appharbor.com/ Este projecto está disponivel para download no CodePlex.]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://nblog.codeplex.com/" target="_blank">NLog</a> é um sistema de blogs desenvolvido em ASP.NET MVC 3, Razor, JQuery e C#.</p>
<p>Podem ver em funcionamento em <a title="http://chrisfulstow.com/" href="http://chrisfulstow.com/">http://chrisfulstow.com/</a> ou <a title="http://blog.appharbor.com/" href="http://blog.appharbor.com/">http://blog.appharbor.com/</a></p>
<p>Este projecto está disponivel para download no <a href="http://www.codeplex.com/" target="_blank">CodePlex</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tiagosalgado.com/2011/02/26/nblog-asp-net-mvc-3-0-blog-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entity Framework Tutorials</title>
		<link>http://blog.tiagosalgado.com/2011/01/19/entity-framework-tutorials/</link>
		<comments>http://blog.tiagosalgado.com/2011/01/19/entity-framework-tutorials/#comments</comments>
		<pubDate>Tue, 18 Jan 2011 23:59:00 +0000</pubDate>
		<dc:creator>Tiago Salgado</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[vb.net]]></category>

		<guid isPermaLink="false">http://blog.tiagosalgado.com/entity-framework-tutorials/</guid>
		<description><![CDATA[Estão disponiveis no site ASP.NET uma série de tutoriais sobre Entity Framework. Cada um contem ainda um exemplo para download em C# e VB.NET. The Entity Framework and ASP.NET – Getting Started Part 1 The Entity Framework and ASP.NET – Getting Started Part 2 The Entity Framework and ASP.NET – Getting Started Part 3 The]]></description>
			<content:encoded><![CDATA[<p>Estão disponiveis no site <a href="www.asp.net" target="_blank">ASP.NET</a> uma <a href="http://www.asp.net/entity-framework/tutorials" target="_blank">série de tutoriais sobre Entity Framework</a>. Cada um contem ainda um exemplo para download em C# e VB.NET.</p>
<p><a href="http://www.asp.net/entity-framework/tutorials/the-entity-framework-and-aspnet-%E2%80%93-getting-started-part-1" target="_blank">The Entity Framework and ASP.NET – Getting Started Part 1</a>     <br /><a href="http://www.asp.net/entity-framework/tutorials/the-entity-framework-and-aspnet-%E2%80%93-getting-started-part-2" target="_blank">The Entity Framework and ASP.NET – Getting Started Part 2</a>     <br /><a href="http://www.asp.net/entity-framework/tutorials/the-entity-framework-and-aspnet-%E2%80%93-getting-started-part-3" target="_blank">The Entity Framework and ASP.NET – Getting Started Part 3</a>     <br /><a href="http://www.asp.net/entity-framework/tutorials/the-entity-framework-and-aspnet-%E2%80%93-getting-started-part-4" target="_blank">The Entity Framework and ASP.NET – Getting Started Part 4</a>     <br /><a href="http://www.asp.net/entity-framework/tutorials/the-entity-framework-and-aspnet-%E2%80%93-getting-started-part-5" target="_blank">The Entity Framework and ASP.NET – Getting Started Part 5</a>     <br /><a href="http://www.asp.net/entity-framework/tutorials/the-entity-framework-and-aspnet-%E2%80%93-getting-started-part-6" target="_blank">The Entity Framework and ASP.NET – Getting Started Part 6</a>     <br /><a href="http://www.asp.net/entity-framework/tutorials/the-entity-framework-and-aspnet-%E2%80%93-getting-started-part-7" target="_blank">The Entity Framework and ASP.NET – Getting Started Part 7</a>     <br /><a href="http://www.asp.net/entity-framework/tutorials/the-entity-framework-and-aspnet-%E2%80%93-getting-started-part-8" target="_blank">The Entity Framework and ASP.NET – Getting Started Part 8</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tiagosalgado.com/2011/01/19/entity-framework-tutorials/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Asynchronous Programming for C# and Visual Basic</title>
		<link>http://blog.tiagosalgado.com/2010/11/01/asynchronous-programming-for-c-and-visual-basic/</link>
		<comments>http://blog.tiagosalgado.com/2010/11/01/asynchronous-programming-for-c-and-visual-basic/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 17:56:08 +0000</pubDate>
		<dc:creator>Tiago Salgado</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.tiagosalgado.com/?p=592</guid>
		<description><![CDATA[Visual Studio Async CTP Download a CTP with new syntax and APIs for asynchronous development. Whitepaper: Asynchrony in .NET Get an overview of the new asynchronous features being developed for C#, Visual Basic and the .NET Framework. Walkthrough: Getting Started with Async Follow step-by-step instructions for converting a synchronous solution in Visual Basic or C#]]></description>
			<content:encoded><![CDATA[<p><a id="ctl00_mainContentContainer_ctl02" title="Visual Studio Async CTP" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl02',this);" href="http://go.microsoft.com/fwlink/?LinkId=203690"><strong>Visual Studio Async CTP</strong></a></p>
<p>Download a CTP with new syntax and APIs for asynchronous development.</p>
<p><a id="ctl00_mainContentContainer_ctl04" title="Whitepaper: Asynchrony in .NET" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl04',this);" href="http://go.microsoft.com/fwlink/?LinkId=204844"><strong>Whitepaper: Asynchrony in .NET</strong></a></p>
<p>Get an overview of the new asynchronous features being developed for C#, Visual Basic and the .NET Framework.</p>
<p><a id="ctl00_mainContentContainer_ctl06" title="Walkthrough: Getting Started with Async" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl06',this);" href="http://go.microsoft.com/fwlink/?LinkId=203988"><strong>Walkthrough: Getting Started with Async</strong></a></p>
<p>Follow step-by-step instructions for converting a synchronous solution in Visual Basic or C# to an asynchronous one by using the new asynchronous features.</p>
<p><a id="ctl00_mainContentContainer_ctl08" title="Iterators in Visual Basic" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl08',this);" href="http://go.microsoft.com/fwlink/?LinkId=204549"><strong>Iterators in Visual Basic</strong></a></p>
<p>Learn about the iterators that this CTP introduces in Visual Basic. An iterator function or get accessor performs a custom iteration over a collection, and uses the Yield statement to return each element in turn.</p>
<p><strong>101 Samples in C# and Visual Basic</strong></p>
<p>Download the CTP and then use the 101 samples (in DocumentsMicrosoft Visual Studio Async CTPSamples) to try the new Async CTP features yourself. Check back for an online version coming soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tiagosalgado.com/2010/11/01/asynchronous-programming-for-c-and-visual-basic/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Utilizar a API do bit.ly para gerar um url curto em C#</title>
		<link>http://blog.tiagosalgado.com/2010/04/24/utilizar-a-api-do-bit-ly-para-gerar-um-url-curto-em-c/</link>
		<comments>http://blog.tiagosalgado.com/2010/04/24/utilizar-a-api-do-bit-ly-para-gerar-um-url-curto-em-c/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 23:33:13 +0000</pubDate>
		<dc:creator>Tiago Salgado</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[dicas]]></category>

		<guid isPermaLink="false">http://blog.tiagosalgado.com/utilizar-a-api-do-bit-ly-para-gerar-um-url-curto-em-c/</guid>
		<description><![CDATA[Hoje andei a dar uma olhadela à API do serviço bit.ly. Para utilizarmos basta mesmo criar uma conta, e com a key que gera para utilizarmos a API rapidamente fazemos qualquer brincadeira. Segue um exemplo rápido de como gerar um link curto a partir da URL inserida. string username = "username"; string api = "your_api_key";]]></description>
			<content:encoded><![CDATA[<p>Hoje andei a dar uma olhadela à API do serviço bit.ly. Para utilizarmos basta mesmo criar uma conta, e com a key que gera para utilizarmos a API rapidamente fazemos qualquer brincadeira.</p>
<p>Segue um exemplo rápido de como gerar um link curto a partir da URL inserida.</p>
<p style="background-color: white;"><code style="font-size: 12px;"><span style="color: blue;">string </span><span style="color: black;">username </span><span style="color: blue;">= </span><span style="color: darkred;">"username"</span><span style="color: gray;">;<br />
</span><span style="color: blue;">string </span><span style="color: black;">api </span><span style="color: blue;">= </span><span style="color: darkred;">"your_api_key"</span><span style="color: gray;">;<br />
</span><span style="color: blue;">using </span><span style="color: gray;">(</span><span style="color: black;">WebClient w </span><span style="color: blue;">= new </span><span style="color: black;">WebClient</span><span style="color: gray;">())<br />
</span><span style="color: black;">{<br />
</span><span style="color: blue;">string </span><span style="color: black;">LongUrl </span><span style="color: blue;">= </span><span style="color: darkred;">"http://blog.tiagosalgado.com"</span><span style="color: gray;">;<br />
</span><span style="color: blue;">string </span><span style="color: black;">bitLyUrl </span><span style="color: blue;">=string</span><span style="color: black;">.Format</span><span style="color: gray;">(</span><span style="color: darkred;">"http://api.bit.ly/v3/shorten?login={0}&amp;apiKey={1}&amp;uri={2}&amp;format=txt"</span><span style="color: gray;">,</span><span style="color: black;">username</span><span style="color: gray;">,</span><span style="color: black;">api</span><span style="color: gray;">,</span><span style="color: black;">LongUrl</span><span style="color: gray;">);<br />
</span><span style="color: blue;">string </span><span style="color: black;">ShortUrl </span><span style="color: blue;">= </span><span style="color: black;">w.DownloadString</span><span style="color: gray;">(</span><span style="color: black;">bitLyUrl</span><span style="color: gray;">);<br />
</span><span style="color: black;">Console.Write</span><span style="color: gray;">(</span><span style="color: black;">ShortUrl</span><span style="color: gray;">);<br />
</span><span style="color: black;">Console.Read</span><span style="color: gray;">();<br />
</span><span style="color: black;">}</span></code></p>
<p>E temos algo como isto:</p>
<p><img src="http://img691.imageshack.us/img691/154/outputbitlyapp.png" alt="" width="677" height="342" /></p>
<p><a title="Download do Projecto" href="http://www.box.net/shared/pr65xpnjhe" target="_blank"><img src="http://e3.boxcdn.net/resources/a5y417x8pf/thumbs/27x30/application/zip.gif" border="0" alt="File icon" width="24" height="24" align="absMiddle" />bitLy_get_shorturl_csharp.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tiagosalgado.com/2010/04/24/utilizar-a-api-do-bit-ly-para-gerar-um-url-curto-em-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extrair texto entre tags HTML (LINQ+Regex)</title>
		<link>http://blog.tiagosalgado.com/2010/04/15/extrair-texto-entre-tags-html-linqregex/</link>
		<comments>http://blog.tiagosalgado.com/2010/04/15/extrair-texto-entre-tags-html-linqregex/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 21:26:21 +0000</pubDate>
		<dc:creator>Tiago Salgado</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Regular Expressions]]></category>

		<guid isPermaLink="false">http://blog.tiagosalgado.com/extrair-texto-entre-tags-html-linqregex/</guid>
		<description><![CDATA[Hoje o meu colega de trabalho pediu-me para o ajudar a extrair uma parte do texto de uma página p/ ser posteriormente enviado. Não se trata nada de complexo, apenas apeteceu-me deixar aqui p/ consultar mais tarde caso precise O HTML da página que deve ser pesquisado é algo como: &#60;TD valign=top colspan=6&#62;TESTE 1XPTO ONLINE&#60;/TD&#62;]]></description>
			<content:encoded><![CDATA[<p>Hoje o meu colega de trabalho pediu-me para o ajudar a extrair uma parte do texto de uma página p/ ser posteriormente enviado.</p>
<p>Não se trata nada de complexo, apenas apeteceu-me deixar aqui p/ consultar mais tarde caso precise <img src='http://blog.tiagosalgado.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>O HTML da página que deve ser pesquisado é algo como:</p>
<div class="csharpcode">
<pre class="alt"><span class="kwrd">&lt;</span><span class="html">TD</span> <span class="attr">valign</span>=<span class="attr">top</span> <span class="attr">colspan</span>=<span class="attr">6</span><span class="kwrd">&gt;</span>TESTE 1XPTO ONLINE<span class="kwrd">&lt;/</span><span class="html">TD</span><span class="kwrd">&gt;</span></pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</p>
<p>Para o fazer, fiz o seguinte código:</p>
<div class="csharpcode">
<pre class="alt">Regex r = <span class="kwrd">new</span> Regex(<span class="str">&quot;&lt;TD(.*?)&gt;(.*?)&lt;/TD&gt;&quot;</span>);</pre>
<pre><span class="kwrd">string</span> s = <span class="str">@&quot;&lt;TD valign=top colspan=6&gt;TESTE 1XPTO ONLINE&lt;/TD&gt;</pre>
<pre class="alt">            &lt;TD valign=top colspan=6&gt;TESTE 2XPTO ONLINE&lt;/TD&gt;</pre>
<pre>            &lt;TD valign=top colspan=6&gt;TESTE 3XPTO ONLINE&lt;/TD&gt;</pre>
<pre class="alt">            &lt;TD valign=top colspan=6&gt;TESTE 4XPTO ONLINE&lt;/TD&gt;</pre>
<pre>            &lt;TD valign=top colspan=6&gt;TESTE 5XPTO ONLINE&lt;/TD&gt;&quot;</span>;</pre>
<pre class="alt">&#160;</pre>
<pre>MatchCollection mc = r.Matches(s);</pre>
<pre class="alt"><span class="kwrd">foreach</span> (Match m <span class="kwrd">in</span> mc)</pre>
<pre>{</pre>
<pre class="alt">    Console.WriteLine(m.Groups[2].Value.Trim());</pre>
<pre>}</pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Outra forma de fazer o mesmo, e recorrendo ao LINQ, é esta:</p>
<div class="csharpcode">
<pre class="alt">var q = from Match m <span class="kwrd">in</span> <span class="kwrd">new</span> Regex(<span class="str">@&quot;&lt;TD(.*?)&gt;(.*?)&lt;/TD&gt;&quot;</span>).Matches(s)</pre>
<pre>        select m.Groups[2].Value.Trim();</pre>
<pre class="alt">&#160;</pre>
<pre>q.ToArray&lt;<span class="kwrd">string</span>&gt;().ToList().ForEach(<span class="kwrd">new</span> Action&lt;<span class="kwrd">string</span>&gt;(EnviarSinais));</pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Por fim, basta criar a função <strong>EnviarSinais</strong>:</p>
<div class="csharpcode">
<pre class="alt"><span class="kwrd">static</span> <span class="kwrd">void</span> EnviarSinais(<span class="kwrd">string</span> str)</pre>
<pre>{</pre>
<pre class="alt">        Console.WriteLine(str);</pre>
<pre>}</pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Quanto ao código em LINQ, se houver melhor forma de o fazer, indiquem pf <img src='http://blog.tiagosalgado.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tiagosalgado.com/2010/04/15/extrair-texto-entre-tags-html-linqregex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Livro LINQ com C#</title>
		<link>http://blog.tiagosalgado.com/2009/05/18/livro-linq-com-c/</link>
		<comments>http://blog.tiagosalgado.com/2009/05/18/livro-linq-com-c/#comments</comments>
		<pubDate>Mon, 18 May 2009 12:51:15 +0000</pubDate>
		<dc:creator>Tiago Salgado</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[livros]]></category>

		<guid isPermaLink="false">http://blog.tiagosalgado.com/?p=388</guid>
		<description><![CDATA[Foi lançado o livro de LINQ com C#, escrito pelo Paulo Morgado e pelo Luis Abreu. Certamente que temos aqui uma boa referência para este tema, tendo em conta a qualidade de informação que estamos habituados a ver cedidas por ambos os autores. Podem encontrar o livro na FCA, na FNAC e na WOOM.]]></description>
			<content:encoded><![CDATA[<p>Foi lançado o livro de LINQ com C#, escrito pelo <a href="http://weblogs.pontonetpt.com/pjmorgado" target="_blank">Paulo Morgado</a> e pelo <a href="http://msmvps.com/blogs/luisabreu/" target="_blank">Luis Abreu</a>.</p>
<p>Certamente que temos aqui uma boa referência para este tema, tendo em conta a qualidade de informação que estamos habituados a ver cedidas por ambos os autores.</p>
<p>Podem encontrar o livro na <a href="http://www.fca.pt/cgi-bin/fca_main.cgi/?isbn=978-972-722-547-7&amp;op=2" target="_blank">FCA</a>, na <a href="http://www.fnac.pt/pt/Catalog/Detail.aspx?cIndex=0&amp;catalog=livros&amp;categoryN=Livros&amp;category=informatica&amp;product=9789727225477" target="_blank">FNAC</a> e na <a href="http://www.wook.pt/ficha/linq-com-c-/a/id/1801457/filter/" target="_blank">WOOM</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tiagosalgado.com/2009/05/18/livro-linq-com-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

