in Eski Blog Yazılarım

XmlSerializer’da Boş Namespace

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 Bırak

Comment