Bir önceki çalışmada xml yaratmayı gördük. Şimdi yarattığımız xml dosyasını kullanalım ve üzerinde biraz oynayalım.
Okumak
için bir çok yol var en sevdiğim ve bana kolay gelen. xml linq .alışık
olduğumuz linq yapısını xml uygulamak hem işleri kolaylaştırıyor hemde
kod anlamlılığını arttırıyor.
Xml dosyamız aşağıdaki fortmatta gösterildiği gibi olsun
<?xml version="1.0" encoding="UTF-8"?>
<Haberler>
<Haber>
<Type>H</Type>
<Tarih>2013-09-02T10:50:00.0000000+03:00</Tarih>
<Web>RadikalKitap</Web>
<ImagePath>http://kitap.ilgilisin.com/Content/Images/notfound/kitap-notfound.jpg</ImagePath>
<Title>Jamie Oliver’dan “siyasi” bağış</Title>
<ShortDesc> Ünlü İngiliz aşçı, yoksul aileler hakkında yaptığı
açıklamaların tartışma yaratmasının hemen ardından son kitabını ülkedeki
4 binden fazla kütüphaneye bağışlama kararı aldı.</ShortDesc>
<LongDesc><![CDATA[ <p> Jaime Oliver’ın yayıncısı
Penguin Random House, ünlü şefin “Save with Jamie” adlı son kitabından
birer kopyayı ]]></LongDesc>
<ImagePathDesc>http://kitap.ilgilisin.com/Content/Images/notfound/kitap-notfound.jpg</ImagePathDesc>
<StoreId>8</StoreId>
<IsSlider>False</IsSlider>
<IsTopSlider>False</IsTopSlider>
<IsBottomSlider>False</IsBottomSlider>
<Tags>ülke,İngiltere</Tags>
<NumberOfViews>1767</NumberOfViews>
<NumberOfLike>34</NumberOfLike>
<NumberOfDisLike>1414</NumberOfDisLike>
</Haber>
<Haber>
.
.
</Haber>
<Haber>
.
.
</Haber>
<Haber>
.
.
</Haber>
</Haberler>
System.Xml.Linq namespace adı ile bu sınıfı kullanabiliriz.
public XmlOku(string path)
{
var list=XDocument.Load(path).Root.Elements().ToList();
}
artık
elimizde üzerinde çalışabileceğimiz bir List sınıfı var. Eskiden
foreach döngüleriyle üzerinde çalışırdık Şimdi Linq'nun listeler
üzerindeki gücünü kullanıyoruz.
Ön alıştırma olarak bir fonksiyonla bu listtin eleman sayısını alalım
public int GetXmlElemanCount(string path)
{
return XDocument.Load(path).Root.Elements().ToList().Count();
}
Bu basit fonksiyon parametre olarak gelen dosya yolunu okuyuo bu dosyadaki eleman sayısı ile bize dönecek;
Şimdi listemizdeki storeId lere sabit bir değer atayalım
XDocument.Load(path).Root.Elements().ToList().ForEach(x=>x.StoreId=storeId);
tek satırda hem xml dosyamızı okuttuk hemde foreach medotu ile bu listenin bütün elemanlarının içindeki bir değeri değiştirdik.
Büyük
listeler servera gönderirken sorun çıkarabilir genelde serverlardaki yüklenen dosya büyüklüğü 4 Mb ile sınırlıdır. Bunu göz önüne alarak listemizi küçük parçalara ayıralım ve sonucu Xml string olarak alalım. Bu arada storeId yide
yeniden atayalım
public string SplitXml(int storeId,string path, int start = 0, int length = Int32.MaxValue)
{
StringBuilder sb = new StringBuilder(@"<?xml version='1.0' encoding='UTF - 8'?><Haberler>");
XDocument.Load(path).Root.Elements()
.Skip(start).Take(length).ToList().ForEach(x => sb.Append(SetStoreId(x,storeId).ToString()));
sb.Append("</Haberler>");
return sb.ToString();
}
}
public XElement SetStoreId( XElement x,int storeId)
{
x.SetElementValue("StoreId", storeId);
return x;
}
StringBuilder sb = new StringBuilder(@"<?xml version='1.0' encoding='UTF - 8'?><Haberler>");
XDocument.Load(path).Root.Elements()
Dosyayı okuttuk ve root elemanından itibaren aldık.
.Skip(start).Take(length).ToList().
Skip medoduyla start değeri kadar atladık ve oradan listeden length degeri kadar satırı Take medodunu kullanarak ayrı bir liste haline getirdik.
Bu listenin her satırına ForEach medoduyla ulaştık burada SetSoreId fonksiyonunu ForEach içinde her satıra uyguladık. Fonksiyondan dönen elemanı stringbuilder tipinde olan sb.Append medoduyla sb değişkenine ekledik.
SplitXml(5,"yol.xml" 300,700);
parametleriyle fonsiyonunu çağırdığımızda yol .xml dosyadını okuyacak 300 satırdan itibaren 700 satırı bir liste haline getirecek ve bu listenin her bir elemanına SetStoreId fonksinyunu uygulayarak storeId değerine 5 tam sayısını atayacak.
SplitXml fonksiyonunda bir satırda bir çok sorunumuzu çözdük. dosyamızı okuduk,skip ve store metodlarıyla
yeni bir list oluşturduk Bu liste uyguladığımız. foreach metodunda
SetStoreId functionını kullanarak store idleri değiştirdik ve string
builder sınıfımızı kullanarak xml string yarattık.
Bu günlük bu kadar. Sonraki günlerde yarattığımız bu xml stringi webclient sınıfını kullanarak servera göndereceğiz.
Kendinize iyi bakın
Serdar GÜNER
http://epubevi.com
Hiç yorum yok:
Yorum Gönder