Dataveri kaynağınız xml olduğunda içindeki verileri okumak veritabanındandatabase okumak kadar kolay olmayabilir. XmlDataSorce nesnesiclass ile bu işlemi basit bir hale getirebilir.
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="XmlDataSource1"> <HeaderTemplate> <table style="font-family:Verdana;font-size:11px;"> </HeaderTemplate> <ItemTemplate> <tr> <td> <a href='<%# XPath("link") %>'> <%# XPath("title") %> </a> </td> </tr> <tr> <td style="text-align:right;font-style:italic;"> <%# XPath("pubDate")%> </td> </tr> <tr> <td> <%# XPath("description")%> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater> <asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="http://www.ayrilmaz.com/rss" XPath="rss/channel/item"></asp:XmlDataSource>
Kodu biraz incelersek; XmlDataSource nesneclass sinin DataFile özelliğiproperty xml dosyasının yolunu ister. Bu disk üzerinde bir dosya olabileceği gibi bir rss dökümanı da olabilir. Burada önemli olan DataFile ile belirttilen verinin nasıl gösterileceğidir. Bunu yapmanın en pratik yolu ise xpath özelliğini kullanmaktır.
Veri kaynağını belirttikten sonra bunu gösterecek bir kontrole ihtiyaç var. Benim seçimim Repeater olacak. (DataList yada Grid de kullanılabilir). ItemTemplate içinde göstermek istenilen node adı XPath metoduna parametre olarak verilir ve değeri gösterilir.
Örnek proje.
Daha önceki "Web Sitemiz .." başlıklı bir kaç yazımda Web Part' lar hazırlamıştım. Yeni bir kontrol daha; Tcmb günlük döviz bilgileri.
Uygulamayı indirmek için tıklayın.
Kullanım kolaylığı için 2 adet özellik eklendi.
Bu tip uygulamaları yaparken kaynağın kopyası üzerinde çalışmayı tercih ederim. Hız açısından.
public static string[] dovizBilgisi(DovizTipleri tip) { if (HttpContext.Current.Cache[tip.ToString()] == null) { XmlDocument xDoc = new XmlDocument(); // local -> test xDoc.Load(HttpContext.Current.Server.MapPath("App_Data/doviz.xml")); // online -> application // xDoc.Load("http://www.tcmb.gov.tr/kurlar/today.xml"); string[] doviz = { xDoc.SelectSingleNode(string.Format( "Tarih_Date/Currency[@Kod='{0}']/ForexBuying", tip.ToString())).InnerText.Replace('.', ','), xDoc.SelectSingleNode(string.Format( "Tarih_Date/Currency[@Kod='{0}']/ForexSelling", tip.ToString())).InnerText.Replace('.', ',') }; HttpContext.Current.Cache.Insert( tip.ToString(), doviz, null, DateTime.Now.AddHours(2), TimeSpan.Zero); } return (string[])HttpContext.Current.Cache[tip.ToString()]; }
Xslt ile çalışıyorsanız bir kaç küçük ayrıntı. - Xml verilerini sıralamak için for-each kalıbına
<xsl:sort select="." order="ascending"/>
yazmak yeterli. - Satırları ardışık olarak renklendirmek için de mod operatörü ve position() fonksiyonu bu işin üstesinden gelecektir.
<xsl:variable name=mod1 select="position()"/> <xsl:if test="$modi mod 2 = 1">
Kodun tamamı;
<?xml version="1 .0" encoding="utf-8" ?> <Sehirler> <Sehir>Istanbul / Ataturk</Sehir> <Sehir>Ankara / Esenboga</Sehir> <Sehir>Ankara / Etimesgut</Sehir> <Sehir>Murted Tur—Afb</Sehir> <Sehir>Adana / Sakirpasa</Sehir> <Sehir>Adana / Incirlik</Sehir> <Sehir>Atyon</Sehir> <Sehir>Antalya</Sehir> <Sehir >Gaziantep</Sehir> <Sehir>Iskenderun</Sehir> <Sehir>Konya</Sehir> <Sehir>Merzifon</Sehir> <Sehir>Samsun</Sehir> <Sehir>Sivas</Sehir>
Xml verisinin devamı için tıklayın...
<xsl:template match="/"> <table style="width :200px;color:#333333;border-collapse:collapse;font-family:verdana;font-size : 10px;" cellspacing="0" cellpadding="4" border="0"> <tr style="color:White;background-color:#5D7B9D;font-weight:bold;"> <th scope="col">Şehirler</th> </tr> <xsl:for-each select="Sehirler/Sehir"> <xsl:sort select="." order="ascending"/> <xsl:variable name="modi" select="position()"/> <xsl:if test="$modi mod 2 = 1"> <tr style="color:#333333;background-color:#F7F6F3;"> <td> <xsl:value-of select="." /> </td> </tr> </xsl:if> <xsl:if test="$modi mod 2 = 0"> <tr style="color:#284775;background-color:White;"> <td> <xsl:value-of select="."/> </td> </tr> </xsl:if> </xsl:for-each> <tr style="color:White;background-color:#5D7B9D;font-weight:bold;"> <th>-</th> </tr> </table> </xsl:template>
Şöyle bir düşündüğümüzde veritabınında bulunan herhangi bir tablonun verilerini Xml formatında dosyaya yazmanın kaç yolu vardır acaba? Sabahları genelde işe erken gelirim, 1.5 saat kadar :). Oturdum bir kaç örnek yaptım, paylaşıyorum tüm dünya ile. (Özgüvenin tavan yaptığı an) Aklıma gelen ilk yöntem DataTable nesnesini kullanmak. Bu nesneyi sadece yazmak için kullanmak kaynak tüketimi açısından çok iyi bir seçim olmaz fakat kullanım kolaylığı açısında tercih edilebilir.
Diğer bir yöntem ise henüz Veri KatmanındaDataLayer iken oracıkta Xml formatına dönüştürüp XmlTextWriter ile cayır cayır yazmak.
Son yöntem ise daha önce şu yazıda kullandığım teknik ile (attributenitelik yerine bu sefer nodedüğüm kullandım) XDocument ile manuel olarak Xml dosyasını oluşturmak. Sanırım en zoru bu. Yanlış anlaşılmasın benim için kolay da hani ilk yapan için diyorum :)
Uzun zamandır Strong Type DataSet kullanmadığımdan basit bir uygulama yazmak belki bir kaç yenilik varsa da görmek istedim. Dataset içine basit birkaç veri girebileceğim DataTable ekledim. Ms Sql Server ile uğraşmamak için veri kaynağı olarak Xml' i uygun gördüm. Daha sonra aklıma keşke içi dolu bir Xml dosyası olasa da test işlemlerini hemen yapsam. Visual Studio 2008 kullanıyorsanız eğer Xml Schema Explorer penceresini bilirsiniz. O pencerede DataTable' a sağ tıklarsanız tam aradığım şey ile karşılaşırsınız. Generate Sample XML Sonuç;
Bir uygulama düşünün ki veriler Xml dosyasında sunum ise WebForm' unda olsun.
İşte tam aradığımız kontrol;
Verileri Xml dosyasında saklamının avantajlarından birisi de Xslt ile web uygulamalarına kolayca adapte edilebilmesidir. Örnek Xml verisi için Xslt kodu;
sonuç;
Proje kodları.