19 Şubat 2018 Pazartesi

XDocument Sınıfı

Giriş
Şu satırı dahil ederiz.
using System.Xml.Linq;
.Net ile XML ile çalışmak için bir sürü sınıf geliyor. Bunlar şöyle.XmlReader
XmlDocument
XDocument
XmlTextReader
XmlSerializer
Bu sınıf "Linq To Xml" teknolojisini kullandığı için XmlDocument sınıfına göre çok daha kullanışlı.

XMl Nedir
XML kısaltması sonunda Language kelimesi geçiyor. XML'in dil olup olmadığı tartışılabilir ancak L kısaltması tarihsel olarak mevcut.
XML'in atası 1970'lerde GML (Goldfarb, Mosher and Lorie) idi. Daha sonra SGML (Standardized General Markup Language) oldu. Nihayetinden XML olarak karşımıza çıktı.
Descendants metodu
IEnumerable<XElement> listesi döner. Düğümün altındaki tüm kademelerdeki düğümleri verir. Şöyle yaparız.
IEnumerable<XElement> nodes = doc.Descendants("queryString"));
Şöyle yaparız.
List<XElement> lat = doc.Descendants("lat").ToList();
DescendantNodes metodu
Şöyle yaparız.
foreach (var node in doc.DescendantNodes()) {...}
Elements metodu
Linq ile kullanılabilir. Düğümün hemen altındaki düğümleri verir. En son "patch" düğümünü şöyle alırız.
<root>
<patch></patch>
.
.
<patch></patch>
</root>

XDocument doc = XDocument.Load("yourfile.xml");          
XElement root = doc.Root;
Console.WriteLine(root.Elements("patch").Last());
Elements arka arkaya çağrılarak Descendents gibi kullanılabilir. Elimizde şöyle bir XML olsun.
<?xml version="1.0" encoding="UTF-8" ?>
<Car>
 <Location name = "somewhere">
  <Type type="itstype">
   <Price>135</Price>
  </Type>
  </Location>
 <Location name = "somewhere">
  <Type type="itstype">
   <Price>250</Price>
  </Type>
 </Location>
</Car>  
En yüksek ücreti şöyle buluruz. Önce Elements ile Location düğümleri seçilir. Her Location altındaki Type düğümü seçilir. Her type için Price düğümü seçilir ve en yüksek değer bulunur.
public int HighestPrice(string xmlFilePath)
{
    var doc = XDocument.Load(xmlFilePath);
    var cars = doc.Root.Elements("Location").Select(e => e.Element("Type"));
    return cars.Max(c => int.Parse(c.Element("Price").Value));
}
GetDefaultNamespace metodu
Şöyle yaparız.
XNamespace ns = xdoc.GetDefaultNamespace();
Load metodu - path
Belirtilen XML dosyasını yükler. Bu metod XElement sınıfında da mevcut. Şöyle yaparız.
var doc = XDocument.Load("D:/myXml.xml");
Load metodu - stream
Örnek
Şöyle yaparız.
XDocument xdoc = XDocument.Load(stream);
Load metodu - stream + LoadOptions
Örnek
LoadOptions kullanarak şöyle yaparız.
public static async Task<XDocument> LoadAsync(String path,
  LoadOptions loadOptions = LoadOptions.PreserveWhitespace)
{
  return Task.Run(()=>{
    using (var stream = File.OpenText(path))
    {
      return XDocument.Load(stream, loadOptions);
    }
  });
}
LoadAsync metodu
Örnek ver

Parse metodu
Verilen XML string'ini parse eder. Şöyle yaparız.
var doc = XDocument.Parse(@"<CAR>...</CAR>");
Root Alanı
XML'deki ilk düğüme erişmemizi sağlar. Bir XElement nesnesi döner.
XElement root = doc.Root;
Örnek
Elimizde şöyle bir XML olsun ve tüm name değerlerine erişmek isteyelim.
<?xml version="1.0" encoding="UTF-8"?>
<report name="ReportName">
  <agency name="agency1">
    <office name="office1"></office>
    <office name="office2"></office>
    <office name="office3"></office>
  </agency>
  <agency name="agency2">
    <office name="office1">
      <agent name="agent Amy"></agent>
      <address name="address line"></address>
    </office>
    <office name="office2"></office>
    <office name="office3"></office>
  </agency>
  <agency name="agency3">
    <office name="office1">
      <agent name="agent Bettie">
        <subagent name="sub-agent bob">
          <phone name="456-789-1230"></phone>
        </subagent>
        <subagent name="sub-agent billy"></subagent>
      </agent>
      <address name="address line">
        <faxnumber name="1234567890"></faxnumber>
      </address>     
    </office>
    <office name="office2"></office>
    <office name="office3"></office>
  </agency>
</report>
Şöyle yaparız.
var names = 
    XDocument
        .Parse(xml)
        .Root
        .Descendants()
        .Select(x => x.Attribute("name").Value)
        .ToList();
Save metodu
Şöyle yaparız. Bu metod XElement sınıfında da mevcut.
var doc = XDocument.Load(xmlFile);
doc.Root.ReplaceNodes(...);
doc.Save(...);

Hiç yorum yok:

Yorum Gönder