logo Unutmayayım diye yazdıklarım...


XmlSerializer'da Boş Namespace

05.09.2009 tarihinde oğuzhan tarafından yazıldı.

Bu aralar banka api'leri ile ilgili bir sürü atraksiyon yapıyoruz. Genelde hepsi xml ile haberleştiğinden yoğun bir şekilde Serializable class oluşturup XmlSerialization kullanıyoruz. Böylece xml nodları ile uğraşmayıp daha yönetilebilir kod ve daha oop programlar yazmış oluyoruz. peh!

Siz aksini belirtmedikçe serileştirdiğiniz class'larda istenmeyen attirubutes'leri sistem kendi ekleyebiliyor. Bunlardan en belası Xml'in kök düğümünde (XmlRoot) Namespace'i kendi kafasına göre vermesidir. Böyle olunca banka xml şablon doğrulamasında takılıp isteğiniz hatalı olarak geri dönüyor. Bunu engellemek için pratik bir yöntem var. Aşağıda bunu vermeye çalışayım.

Örnek Class'ımız
    [Serializable]
[XmlRoot]
public class Banka
{
[XmlAttribute]
public string Host { get; set; }

[XmlAttribute]
public string User { get; set; }

[XmlAttribute]
public string Pass { get; set; }

[XmlElement]
public string Amount { get; set; }
}
Bu basit class'ı serileştirdiğimizde aşağıdaki gibi bir xml dökümanı oluşturulur.

<?xml version="1.0" encoding="utf-8"?>
<Banka xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Host="https://bankaapi.banka.com" User="kahtalimici" Pass="michaeljacson">
    <Amount>10.50</Amount>
</Banka>

Serileştirme sonucu xmlns namespace'ini sistem kendisi ekledi ki senaryomuza göre . Bunu engellemek için XmlSerializerNamespaces sınıfını kullanarak boş bir namespace'i Serileştirme metodumuza eklememiz gerekiyor. Bunun için direkt bir metod veya özellik yok ama aşağıdaki gibi hile işimizi görüyor.
            string XmlData;

Banka bb = new Banka();
bb.Amount = "10.50";
bb.Host = "https://bankaapi.banka.com";
bb.Pass = "michaeljacson";
bb.User = "kahtalimici";

XmlSerializerNamespaces ns_bos = new XmlSerializerNamespaces();
ns_bos.Add("", "");

MemoryStream mstr = new MemoryStream();
XmlTextWriter xtw = new XmlTextWriter(mstr, Encoding.UTF8);
XmlSerializer xs = new XmlSerializer(typeof(Banka));
xs.Serialize(xtw, bb, ns_bos);

UTF8Encoding enc = new UTF8Encoding();
XmlData = enc.GetString(mstr.ToArray());

Bunun sonucunda xml dökümanınıza otomatik atanan Namespace attirubutes'leri gelmeyerek yanlış ama daha temiz bir xml dökümanı elde etmiş oluyorsunuz.


 


Yorum Yapın
İsim (String)
Mail (String)
6, 3 daha yapar. (Int)

*NVarChar*3 + html desteğide yok.
(bit)
Sosyal Ağ Antenleri
Blog RSSLinkedinFacebookFlickrTwitterFriendfeedGoogle ReaderYoutubegit
  • Açılış
  • Projelerim
  • Arşiv
  • İletişim
  • En çok ilgi görenler...

    HP IPAQ 914c
    Mikrotik
    NETSH'dan faydalanmak
    Togi Twitter Client
    Mikrotik ADSL Bridge.
    Netsis SQL Raporları.
    SQL Server Optimizasyonu.
    VBScript.Encode - Encode
    C# ile DataGridView den Excel 'e
    C# ile mail gönder
    Netsis SQL Server Değişikliği.
    Windows Sunucularda SYN Atakları.

    Rastgele birşeyler...

    Düzenli İfadeler (Re...
    İşte Bloggerlık...
    Plesk için trafiği g...
    ReportViewer Custom ...
    İzmir Kent Kart Efsa...
    Togi 417 Expect Head...
    Özel Radyolar için I...
    T-SQL Bölme İşlemi...
    MSSQL BACKUO T-SQL S...
    Sözün Bittiği Yer...
    C# da ki Action.Acti...
    Kitap Guduubetliği...
    !...
    Türktelekom 25. port...
    Kasmayın Söylüyorum....
    Google Madenci...

    Şebeke

    WHT, Fıroİş, Denizİş, Serkan, Semih, Sewgi, Beşir, İzgençvos, Erkan, Mumin, Aliİş, Lütfü, Alper, Yusuf

    2003 - Oğuzhan YILMAZ
    Bir şey alıntıladığınız zaman kaynak göstermeniz yeterli.


    Web Hosting Sponsor Vargonen Technologiies