İçindekilerGirişİndex
YukarıİlkÖncekiSonraki YokSon
Geriİleri
Yazdır
Onder Teker
on_der_tek_er@yahoo.com

C#.NET'te Bir XML Viewer/Browser

C# ve XML

.NET çerçevesinin en belirgin özelliği belki de XML desteğidir. Bu örnekte bir XML document'ının nasıl load edileceği, element ve attribute'lerine nasıl erişileceği gösterilmektedir. XML yapısı itibarıyle ağaç biçiminde olduğu için en uygun gösterim olarak TreeView'ı seçtim. Bir element'in attribute'lerini göstermek için de tablo, yani DataGrid kullandım. (Kullanıcıdan tek bir bilgi okumak için basit bir diyalog kutusu yaptım ki bunu yapmasak da pekala olurdu. Ama öğretici niteliği var.)

Bütün kodu 'elle' yazdım, yani IDE ortamının otomatik eklediği (uzun,gereksiz) kodlar yok. Bu yaklaşım daha 'profesyonel' olmasının yanısıra okunabilirliği arttırmaktadır.

Örnekte bütün class'lar component mantığında, bazı base class'ları extend etmek suratiyle yazılmıştır. Örneğin XmlTreeView class'ı bağımsız bir control olarak başka programlarda da kullanılabilir.

XmlTreeView Class'ı

Bu class bir XmlDocument'ındaki bütün element'leri içinde barındırdığı bir TreeView'a koymaktadır. Yükleme verilen bir path'tan yapılmaktadır. Bu path bir file'a ait olabileceği gibi bir URL'e de ait olabilir.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 using System;
  2 using System.Xml;
  3 using System.IO;
  4 using System.Collections;
  5 using System.Windows.Forms;
  6 namespace Godoro.Xml{
  7   
  8   public class XmlTreeView
  9     : TreeView 
 10   {
 11     private XmlDocument theDocument=new XmlDocument();
 12     public XmlTreeView() {
 13     }  
 14     
 15     public void Load(string filepath) {
 16       try{
 17         theDocument.Load(filepath);  
 18         Nodes.Clear();
 19         XmlNode xroot=theDocument.DocumentElement;    
 20         TreeNode root=ToTreeNode(xroot);
 21         Nodes.Add(root);
 22       }catch(Exception e){
 23         Console.WriteLine(e.StackTrace);
 24       }
 25     }
 26     private TreeNode ToTreeNode(XmlNode xnode) {
 27       if(xnode is XmlText){
 28         TreeNode node=new TreeNode(xnode.Value);
 29         node.Tag=xnode;
 30         return node;        
 31       }else if (xnode is XmlAttribute){
 32         TreeNode node=new TreeNode(xnode.Name +" : "+xnode.Value);
 33         node.Tag=xnode;
 34         return node;        
 35       }else if (xnode is XmlElement){
 36         TreeNode node=new TreeNode(xnode.Name);
 37         node.Tag=xnode;
 38         if(xnode.Attributes.Count>0){
 39           IEnumerator e=xnode.Attributes.GetEnumerator();
 40           while(e.MoveNext()){
 41             XmlNode xchild=(XmlNode)e.Current;
 42             TreeNode child=ToTreeNode(xchild);
 43             node.Nodes.Add(child);
 44           }                  
 45         }
 46         if(xnode.HasChildNodes){
 47           IEnumerator e=xnode.ChildNodes.GetEnumerator();
 48           while(e.MoveNext()){
 49             XmlNode xchild=(XmlNode)e.Current;
 50             TreeNode child=ToTreeNode(xchild);
 51             node.Nodes.Add(child);
 52           }        
 53         }
 54         return node;
 55       }else {
 56         return new TreeNode(xnode.Name);   
 57       }
 58     }
 59     
 60   }
 61 }

Her node'un yüklenmesi recursive olarak tek bir method'la yapılmaktadır. Bu method gerektiğinde (bir element'in içinde başka element'ler olduğunda) kendisini çağırmaktadır.

XML document'ının node'larıyla TreeView'ın node'ları karışabilieceğinden, XML'e ait olanla değişkenlerin başına 'x' konmuştur.

XmlElementView Class'ı

Bu class bir XmlElement'indeki bütün attribute'leri içinde barındırdığı bir DataGrid'e koymaktadır. Bir element'in attributelerini tablo'da görmek için o element'in üzerinde double-click yapılmakta veya farenin sağ tuşuyla çıkan pop-up menu'deki 'Attributes' tıklanmaktadır.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 using System;
  2 using System.Xml;
  3 using System.Data;
  4 using System.Collections;
  5 using System.Windows.Forms;
  6 namespace Godoro.Xml
  7 {
  8   public class XmlElementView
  9     : DataGrid
 10   {
 11   
 12     private DataTable theAttributesTable=null;
 13     
 14     public XmlElementView()
 15     {
 16       DataSet dataset=new DataSet();
 17       theAttributesTable=new DataTable("Attributes");
 18       theAttributesTable.Columns.Add(new DataColumn("Name"));
 19       theAttributesTable.Columns.Add(new DataColumn("Value"));
 20       dataset.Tables.Add(theAttributesTable);
 21       SetDataBinding(dataset,"Attributes");
 22     }
 23     public void SetElement(XmlElement element){
 24       IEnumerator e=element.Attributes.GetEnumerator();
 25       while(e.MoveNext()){
 26         XmlNode node=(XmlNode)e.Current;
 27         if(node is XmlAttribute){
 28           DataRow row=theAttributesTable.NewRow();
 29           row["Name"]=node.Name;
 30           row["Value"]=node.Value;
 31           theAttributesTable.Rows.Add(row);
 32         }
 33       }        
 34     }
 35   }
 36 }

.NET'te bir DataGrid'in içerisine belli bir veriyi koyabilmek için DataSet kullandmak gerekiyor. Burada data set'in table'larına bir table ekleniyor. Bu yeterli oladığı için, dataset'te table'ı ismiyle 'bind' etmek gerekiyor. (Binding için kullanılan isim table'ın ismiyle aynı olmalı.)

DataGrid'de satır eklemeye yarayan '*' gibi bir yapı var, attribue eklenebileceği izlenimi veriyor. Ama eklemiyor, sadece DataGrid varsayılan property'leriyle açılınca onu da koyduğu için orada. Onu yok edecek kodu koyarak gereksiz ayrıntı eklememek için öylece bıraktım.

InputDialog Class'ı

Bu class kullanıcıdan bir değer almaya yarıyor.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 using System;
  2 using System.Windows.Forms;
  3 namespace Godoro.Xml{
  4   public class InputDialog
  5     : Form
  6   {
  7     public Label Prompt=new Label();
  8     public TextBox Input=new TextBox();
  9     public Button Acceptor=new Button();    
 10     public Button Canceller=new Button();    
 11     
 12     public InputDialog(){
 13       SetBounds(200,200,250,150);
 14       
 15       Prompt.SetBounds(0,0,250,30);
 16       Controls.Add(Prompt);
 17       
 18       Input.SetBounds(0,40,250,30);
 19       Controls.Add(Input);
 20       
 21       Acceptor.SetBounds(0,80,120,30);
 22       Controls.Add(Acceptor);
 23       AcceptButton=Acceptor;      
 24       Canceller.SetBounds(120,80,120,30);
 25       Canceller.Text="Cancel";
 26       Controls.Add(Canceller);
 27       CancelButton=Canceller;          
 28     }
 29   }
 30 }

Form class'ındaki AcceptButton ve CancelButton gibi property'lerle standart düğmeleri belirleyebiliyorsunuz.

CacelButton=MyButton

biçiminde bir ifadeyle bir form'un iptal düğmesini atamış oluyoruz.

XmlApplicationForm Class'ı

Bu class asıl programa ait class'dır. Diğer bütün control'leri içeren ve belli event'ler durumunda onları kullanan bu class'tır.

Menu'deki Open ve Browse düğmeleri openClicked() ve browserClicked() event listener methodlarına yönlendirilmektedir. Bir menu item'ına basılması durumunda çalışması gereken method'u belirtmek için :

	EventHandler handler=new EventHandler(myMethod);
	menu.MenuItems.Add("Menu Item Label",handler);

şeklindeki bir kullanım yeterlidir.

XML Document'ının Load Edilmesi

XML document'ları bir File'dan veya bir URL'den yüklenebilir. 'Open' menu item'ındaki seçimde önce ekrana bir FileDialog'u çıkarılmakta, kullanıcıdan öğrenilen dosya'dan XML yüklenmektedir. Browse seçeneğinde de kullanıcıdan bir URL girmesi istenmekte ve girilen URL'de belirtilen XML document'ı load edilmektedir.

Belli bir URL'deki XML http://www.myhost.com/myfolder/Test.xml biçiminde verilir. Bu XML'in elbette well-formed olması gerekir.

Pop-up Menu (ContextMenu) Kullanımı

Bir control'de (bu örnekte TreeView'da) pop-up menu çıkarmak mouse click'leri dinlenmektedir. Double-click (yani click sayısı 2 ise), bir ContextMenu instance'ı yaratılmakta ve click'in X,Y koordinatlarında gösterilmektedir.

Sonuç

Programın ekran çıktısı :

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonraki YokSon
Geriİleri
Yazdır