Xml Okuma İşlemleri

Kodla Büyü

togius

Süper Üye
Süper Üye
Mesajlar
1,726
Örneğimi güncel bir konudan vereceğim. Malumunuz bakanlık bizi il/ilçe scriptlerinde dar kalıp bir şablona zorluyor. Diğer makalelerimde verdiğim yazıların devamı olarak bakanlık sol menünün açılır menüsünü yöneten diksubmenu.xml i okulayı anlatan bir örnek vereyim.

Xml Örneğimiz aşağıdaki gibi olsun.
Kod:
<?xml version="1.0" encoding="utf-8"?>
<menu>
  <altmenu ikon="" altmenuadi="mudurluk">
    <altmenubaglantisatir>
      <baslik>İl Milli Eğitim Müdürü</baslik>
      <link>/Detay/137/il-milli-egitim-muduru.html</link>
      <img>icon.png</img>
      <altmenubaglanti>icon.png</altmenubaglanti>
    </altmenubaglantisatir>
    <altmenubaglantisatir>
      <baslik>Eğitim Denetmenleri Başkanlığı</baslik>
      <link>#</link>
      <img>icon.png</img>
      <altmenubaglanti>icon.png</altmenubaglanti>
    </altmenubaglantisatir>
    <altmenubaglantisatir>
      <baslik>İdari Kadro</baslik>
      <link>#</link>
      <img>icon.png</img>
      <altmenubaglanti>icon.png</altmenubaglanti>
    </altmenubaglantisatir>
    <altmenubaglantisatir>
      <baslik>Stratejik Plan</baslik>
      <link>#</link>
      <img>icon.png</img>
      <altmenubaglanti>icon.png</altmenubaglanti>
    </altmenubaglantisatir>
    <altmenubaglantisatir>
      <baslik>Teşkilat Şeması</baslik>
      <link>#</link>
      <img>icon.png</img>
      <altmenubaglanti>icon.png</altmenubaglanti>
    </altmenubaglantisatir>
  </altmenu>
  <altmenu ikon="" altmenuadi="ilceler">
    <altmenubaglantisatir>
      <baslik>İvrindi</baslik>
      <link>#</link>
      <img />
      <altmenubaglanti />
    </altmenubaglantisatir>
    <altmenubaglantisatir>
      <baslik>Savaştepe</baslik>
      <link>#</link>
      <img />
      <altmenubaglanti />
    </altmenubaglantisatir>
    <altmenubaglantisatir>
      <baslik>Balya</baslik>
      <link>#</link>
      <img />
      <altmenubaglanti />
    </altmenubaglantisatir>
  </altmenu>
</menu>
Design kısmına yani html kısmımıza bir adet LiteralDikSubMenu adında Literal ekleyelim.
Ve kodumuz

Kod:
protected void Page_Load(object sender, EventArgs e)
    {
        this.DikSubMenuGetir();
    }
    private void DikSubMenuGetir()
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(Server.MapPath("~/xml/diksubmenu.xml"));
        XmlNode root = doc.DocumentElement;

        foreach (XmlNode xn in root.SelectNodes("altmenu"))
        {
            bool _mudurluk = xn.Attributes["altmenuadi"].Value == "mudurluk" ? true : false;
            string css = _mudurluk ? "mbmenu" : "mbmenu boxMenu";
            LiteralDikSubMenu.Text += "<div id=\"" + xn.Attributes["altmenuadi"].Value + "\" class=\"" +
                css + "\">";
            if (!_mudurluk)
                LiteralDikSubMenu.Text += "<table border=\"0\" ><tr><td>";
            foreach (XmlNode altxn in xn.SelectNodes("altmenubaglantisatir"))
            {
                string icon = _mudurluk ? "" : " class=\"{img:'icon.png'}\"";
                LiteralDikSubMenu.Text += "<a href=\"" +
                    altxn.SelectSingleNode("link").InnerText + "\"" +
                icon + ">" +
                    altxn.SelectSingleNode("baslik").InnerText + "</a>";
                if (_mudurluk)
                    LiteralDikSubMenu.Text += "<a rel=\"separator\"> </a>";
            }
            if (!_mudurluk)
                LiteralDikSubMenu.Text += "</td></tr></table>";
            LiteralDikSubMenu.Text += "</div>";
        }
    }

Xml okuma yöntemimiz yukarıdadır. .Attirbutes ile xml deki özellikleri okuyor; SelectNodes ile bir node (budak) in altındaki tüm budakları sorguluyor; SelectSingleNode ve InnerText ile bu budağın içindeki değeri getiriyoruz.
 
Güzel paylaşım hocam. Aslında ben de eskiden XML okumak için XmlDocument ve XmlNode kullanırdım ama artık XML belgesinin yapısı biliniyorsa bana göre DataSet ile okutmak daha kolay kodları denemeden yazıyorum ama örneğin;
DataSet ds=new Dataset();
ds.ReadXml(@""~/xml/diksubmenu.xml")");
daha sonra okumak istenilen tablo satırları ds.Tables[0].Rows[0][0].ToString(); vb. kod ile ilk nodun ilk kaydı okunabilir burada artık iş Rows kısmına düşecek.
 
Hocam Dataset kullanmaya bile gerek yok insan gibi xmliniz olduğunda xmldatasource ve basit bir repeater iş görüyor. Lakin bakanlık her an bizden ana sayfalarda index.html isteyebileceğinden ötürü bende böyle bir çözüm yoluna gittim. Ve oradaki div - class yapısına elle tek tek müdahale etmek zorunda kaldım ki bunun hızda bir dezavantajı yok. Tamamen hazırlanmış olan xml in tuhaf halinden ötürü böyle.
 
Geri
Üst