Günümüzde bağımsız uygulamalar arası veri transveri bildiğiniz üzere xml dosyalar ve servisler üzerinden sağlanmaktadır. Bu işlemlerin sağlıklı olması için elbette veri formatlarının uyumlu ve bir protokole dayalı olmalıdır. İşte xml dosyalarda bu protokol xsd dosyaları yani şemalardır. Çalıştığınız iş ortağı size bir şema verdi ve veritabanınızdaki verileri bu formatta oluşturduğunuz bir xml dosyası olarak üretip yollamanızı istiyor. Ya da tam tersi , siz bir xml dosya ürettiniz , karşı tarafa şema vermeniz gerek.
Bu makalede bir şemadan, elimizdeki verilerle doldurulmuş bir xml dosya üreteceğiz. Daha sonra da bu işlemin tersini yapacağız yani bir xml dosyadan onun veri kalıplarını belirleyen bir şema dosyası oluşturacağız.
Şemadan xml dosya üretmek için yapacağımız işlemler :
I. Öncelikle şemadan bir sınıf üretebilmek için Bill amcanın bize sağladığı xsd.exe ‘ ye ihtiyacımız olacak. http://hakanaktan.googlepages.com/xsd.rar adresine koydum buradan aramadan indirebilirsiniz.
II. Ürettiğimiz sınıftan yeni bir nesne üreterek içine , xml dosyamızda olmasını istediğimiz verileri dolduracağız.
III. Elimizdeki nesne serializable olduğundan (xsd.exe nin oluşturduğu sınıf serializable)artık ondan XmlSerializer kullanarak bir xml metni oluşturup dosyaya kaydedebiliriz.
//Hadi bakalım parmaklar çalışsın..
Xsd ogrenciler.xsd /classes
Bu komut bize ogrenciler.cs dosyasını sağlayacaktır. Default olarak C# sınıfı ürettiğinden parametre olarak sadece “/classes” girdik. Eğer vb sınıfı istiyorsanız “/languages” parametresini kullanmanız gerek. Tüm parametreler için “xsd.exe /help” yazmanız gerekecek.
Yukarıdaki şekilde komutun çalıştırılması işlemi sonucunu görmekteyiz.
Sınıfa namespace olarak projemizin adını ekliyoruz. “namespace SemadanXmlYarat” içine aldık. Şemanın neye benzediğini daha kolay anlamak için xml dosyayı aşağıda veriyorum.
Oluşacak dosya yukarıdaki gibi olacaktır. Burada ogrenciler root nesnesinin altında birden fazla öğrenci olabilir ve bir öğrencinin birden fazla dersi olabilir. Bu çoklu yapıda dizilerle uğraşmamak için dizi tanımlarını generic yapı olan List ile değiştirdim, yaptığım değişiklik sonucu oluşan format aşağıdaki gibidir.
Öğrenci ve ders alanları birden fazla nesne içine alacağından alacakları nesne tiplerinde List kullanacağız. Onun dışındakiler ise ilkel tiplerdir. Örnek olarak :
private void btnSemaToXml_Click(object sender, EventArgs e) { string xmlStr = SchemaToXmlString(); TextWriter tWriter = new StreamWriter("ogrencilerXml.xml"); tWriter.WriteLine(xmlStr); tWriter.Close();
}
private string SchemaToXmlString() { //root nesnemizi yaratıyoruz ogrenciler rootOgrenciler = new ogrenciler(); //öğrencileri eklemek için liste oluşturuyoruz List<ogrencilerOgrenci> talebeler = new List<ogrencilerOgrenci>(); //örnek için bir tane yarattık ama daha fazla da olabilir ogrencilerOgrenci ogrenci1 = new ogrencilerOgrenci(); ogrenci1.ad = "Hakan"; ogrenci1.soyad = "Aktan"; ogrenci1.ogrNo = 202003; ogrenci1.bolum = "Bilgisayar Muhendisligi"; //örnek 1 adet ders ekliyoruz ogrencilerOgrenciDers ders1 = new ogrencilerOgrenciDers(); ders1.dersSaat = 4; ders1.dersAd = "Yazilim Muhendisligi"; ders1.dersHoca = "Suleyman Yazicioglu"; ders1.dersKonu = "Yazilim Gelistirme"; ders1.dersNo = 1; //dersler için liste oluşturuyoruz List<ogrencilerOgrenciDers> dersler = new List<ogrencilerOgrenciDers>(); //Listemize yanımladığımız dersi ekledik dersler.Add(ders1); //Derslere dersler listemizi atadık ogrenci1.dersler = dersler;
ogrenci1.dogumTarihi = Convert.ToDateTime("1982-01-01"); //Öğrenciler listesine öğrencimizi ekledik talebeler.Add(ogrenci1); //öğrenci listemize talebeler adlı listemizi atadık rootOgrenciler.ogrenci = talebeler; //serialize işlemine gönderip sonucu geri dönüyoruz return this.SerializeObject(rootOgrenciler); }
Burada kullandığımız diğer fonksiyonlar da aşağıdadır.
private String UTF8ByteArrayToString(Byte[] characters) {
UTF8Encoding encoding = new UTF8Encoding();
String constructedString = encoding.GetString(characters);
return (constructedString);
} public String SerializeObject(Object objectToSerialize) {
try {
String XmlizedString = null;
MemoryStream memoryStream = new MemoryStream();
//XmlSerializer xs = new XmlSerializer(typeof(ogrenciler)); XmlSerializer xs = new XmlSerializer(objectToSerialize.GetType());
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); xs.Serialize(xmlTextWriter, objectToSerialize);
memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());
return XmlizedString;
catch (Exception e) {
System.Console.WriteLine(e);
return null;
Şimdi de sıra xml dosyadan şema üretme işlemine geldi. İşin bu kısmı çok daha kolay. Tek yapmamız gereken, “System.Xml.Schema” kütüphanesini projemize eklemek ve aşağıdaki kodu yazmak.
private void btnXmlToSema_Click(object sender, EventArgs e) { XmlReader reader = XmlReader.Create("ogrencilerXml.xml"); XmlSchemaSet schemaSet = new XmlSchemaSet(); XmlSchemaInference schema = new XmlSchemaInference();
schemaSet = schema.InferSchema(reader);
foreach (XmlSchema s in schemaSet.Schemas()) { s.Write(Console.Out); }
Konsol dan kopyalayıp , text dosyaya yapışturdğımız dosyayı “.xsd” olarak keydettiğimizde artık elimizde bir şemamız olacak. Makalede kullanıdığımız kodların tamamı proje olarak, dosyalarla birlikte aşağıdaki adreste olacaktır.
http://hakanaktan.googlepages.com/SemadanXmlYarat.rar
Dileyenler buradan indirerek inceleyebilirler. Sorularınız olursa e-posta ile ulaşabilirsiniz. Proje VS 2008 ile C# kodlarıyla yazılmıştır.