Makale Özeti

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.

Makale

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..

  1. Xsd.exe yi bilgisayarımıza indirdiysek , Başlat tan cmd yi çalıştırarak bu dizine ulaşalım. Sonra da aynı dizine elimizdeki şema dosyasını koyalım. Sonra da aşağıdaki komutu çalıştıralım.

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.

clip 

Yukarıdaki şekilde komutun çalıştırılması işlemi sonucunu görmekteyiz.

  1. Şimdi sıra bu sınıfı projemi “Add Existing Items” ile dahil etmekte. Dahil ettikten sonra artık sınıfımızı detaylıca görebiliriz.

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.

clip

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.

clip

clip
Öğ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 :

clip

  1. Elimizde sınıfımız olduğuna göre artık ondan türettiğimiz nesneye verilerimizi atıp sonra da nesnemizi serialize ederek xml dosyamızı yaratabiliriz.

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.