Xml üzerinden bir veri okumak istersen XmlTextReader , bir xml dosyası oluşturup yazmak istersek XmlTextWriter sınıfını kullanıyoruz. Ancak bunların yanısıra bu iki işlemi de yapan tek bir sınıf da mevcut XmlDocument sınıfı. Madem iki iki tek başına yapan bir sınıf mevcut neden diğer iki sınıf var ? eğer sadece okuma işlemi yapacaksak XmlTextReader ya da sadece yazma işlemi yapacaksak XmlTextWriter sınıfını kullanmamız daha doğru ve verimlidir. XmlDocument sınıfının ayrıcalığı ise Xmli bize bir document object model olarak sunması ve bize nodelar arasında gezinme şansı vermesidir.
mail.xml
<mail_kutusu>
<mail>
<kime>cagatay</kime>
<kimden>MUSTAFA</kimden>
<konu>YAZILIM</konu>
<mesaj>MESAJ ICERIGI</mesaj>
</mail>
</mail_kutusu>
1. İlk olarak XmlDocument’a ait bir nesne oluşturulur ve xml dosyası bu nesneye yüklenir.
XmlDocument doc = new XmlDocument();
doc.Load("mail.xml");
2. XmlDocument sınıfı bize xml dosyasını tree yapısında bir dom nesnesi olarak sunduğu için xml içerisinde gezinebilmek için root elementi alarak başlamalıyız.
XmlElement elm = doc.DocumentElement;
Console.Write(elm.Name);
Eğer ki root elementin içerisindeki elementler , cocuk ve torunların , iç textlerini çekmek istersek ;
Console.WriteLine(elm.InnerText);
Output : cagatayMUSTAFAYAZILIMMESAJ ICERIGI
Eğer ki bu işlemi taglerle beraber yapmak istersek aşağıdaki ifadeyi kullanırız ancak bu üzerinden çağırıldığı root elementi yazdırmaz.
Console.Writeline(elm.InnerXml);
Output : <mail><kime>cagatay</kime><kimden>MUSTAFA</kimden><konu>YAZILIM</konu><mesaj>MESAJ ICERIGI</mesaj></mail>
Eğer root ile beraber tüm iç xml tagleri ve içerisindeki textleri çekmek istersek aşağıdaki ifadeyi kullanırız
Console.Writeline(elm.OuterXml);
Output : <mail_kutusu><mail><kime>cagatay</kime><kimden>MUSTAFA</kimden><konu>YAZILIM</konu><mesaj>MESAJ ICERIGI</mesaj></mail></mail_kutusu>
Eğer root elementin altındaki sadece child nodelera ulaşmak istersek (torunlar hariç), aşağıdaki ifade bize bu nodeları list olarak döner
XmlNodeList liste = elm.ChildNodes;
int sayi = liste.Count;
string str = "";
for (int i = 0; i < sayi; i++)
{
str += liste[i].Name + "\n";
}
Console.WriteLine(str);
Output : mail
3. Nodelar arasında rastgele gezinmek istersek
Console.WriteLine(elm.FirstChild.Name); //mail
Console.WriteLine(elm.LastChild.Name); //mail_kutusunun son elementi.
Console.WriteLine(elm.FirstChild.NextSibling.Name); //ilk cocuk elementin en yakın kardeşi
Console.WriteLine(elm.LastChild.PreviousSibling.Name); //ilk cocuk elementin en yakın kardeşi
Console.WriteLine(elm.FirstChild.ChildNodes[2].InnerText);
TÜM KOD
class Program
{
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load("C:/Users/LENOVO/documents/visual studio 2017/Projects/ConsoleApp3/ConsoleApp3/mail.xml"); //xmli yükler
XmlElement elm = doc.DocumentElement; //root elementi bir element node olarak verir.
Console.WriteLine(elm.Name); //root elementin adını verir.
Console.WriteLine(elm.InnerText); //root elementin altındaki tüm text verilerini verir.
Console.WriteLine("*******************************************************************");
Console.WriteLine(elm.InnerXml); //root elementin altındaki tüm text verilerini etiketleriyle beraber verir. Root hariç
Console.WriteLine(elm.OuterXml); //root elementin altındaki tüm text verilerini etiketleriyle beraber verir. Root dahil
Console.WriteLine("*******************************************************************");
XmlNodeList liste = elm.ChildNodes; //Root elementin altındaki child nodeları bir liste halinde döndürür.
int sayi = liste.Count;
string str = "";
for (int i = 0; i < sayi; i++)
{
str += liste[i].Name + "\n";
}
Console.WriteLine(str);
Console.WriteLine("*******************************************************************");
Console.WriteLine(elm.FirstChild.Name); //mail
Console.WriteLine(elm.LastChild.Name); //mail_kutusunun son elementi.
Console.WriteLine(elm.FirstChild.NextSibling.Name); //ilk cocuk elementin en yakın kardeşi
Console.WriteLine(elm.LastChild.PreviousSibling.Name); //ilk cocuk elementin en yakın kardeşi
Console.WriteLine(elm.FirstChild.ChildNodes[2].InnerText);
Console.ReadKey();
}
}