Makale Özeti

Bu makale serisinde; System.Xml 2.0 ile gelen bazı yeni özelliklere bakacağız ve sıklıkla kullandığınız bazı XML programlama işlerinizi, yeniliklerle birlikte nasıl daha kolay hale getirebileceğinizi göreceğiz. İki diziden oluşan serinin bu ikinci ve son makalesinde, daha çok XML in yazma, doğrulama, sorgulama, yükleme, kaydetme gibi işlemleri üzerinde yoğunlaşarak yeniliklerin getirdiği kolaylıklara hep birlikte bakacağız.

Makale

System.Xml 2.0 İle Gelen Yenilikler II

Xml Yazma

Mümkün olduğunca hızlı ve etkili XML yazmanız gerektiğinde, XmlWriter kullanabilirsiniz. XmlWriter ın mimarisi, XmlReader ınki ile çok büyük benzerlikler içerir. Tek farkı sadece XML düğümleri yazmaya odaklanmış olmasıdır.

Yine aynı şekilde XmlWriter için yapılmış olan bir çok yenilik de XmlReader için yapılanla aynıdır. İlk olarak, statik Create methodu kullanarak XmlWriter nesneleri yaratabilirsiniz. İkinci olarak, nesnelerde birçok output ayarı belirleyebilmek için kullanabileceğiniz bir XmlWriterSettings sınıfı gelir. Ve son olarak da, XmlWriter, IDisposable ı tam da umduğunuz gibi uygular. Aşağıdaki kod da, XmlWriter kullanılarak hazırlanmış komple bir metot bulacaksınız.

XmlWriter Kullanma
 

Yukarıdaki methot da parametre olarak “101010” “167” “2” değerlerini kullandığınızda; aşağıdaki metini yaratır.

Bu basitleştirmelere ek olarak, XmlWriter, yeni WriteValue metodu ile tip dönüşümleri için destek sağlar. Bu metodun birçok overloads (aynı isimde fakat farklı imzaya sahip olan prosedürler) u vardır. Bunların herbiri farklı bir .NET tipi kabul edebilir. Aşağıdaki kodda bu yöntem kullanılarak hazırlanmıştır.

WriteValue Overloads
 

Yine XmlWriter, XPathNavigator düğümünü XmlWriter çıktısına (XmlReader düğümünü çıktıya kopyalamak için versiyon 1.1 de ne sağlanıyorsa burada aynı) kopyalamayı basitleştirmek için yeni bir WriteNode overload ına sahiptir. Fakat şunu söylemem gerekir ki, genel olarak, dokümanları okumak için yapılmaş olan iyileştirme ve geliştirmeler onları yazmak için yapılmışlar da çok daha fazla.

Doğrulama

Okuma işlemlerinde dokümanı doğrulamak istediğinizde, basit bir şekilde XmlReaderSettings nesnesini konfigüre edebilirsiniz. Aşağıdaki örnekde, XML Şema doğrulaması için yeni bir okuyucuyu nasıl konfigüre edebileceğinizi görebilirsiniz.

Burada, Create i çağırma, birbirine zincirli bir şekilde birçok XmlReader nesnesinin - bir tanesi metin akışını okumak için (XmlTextReaderImpl) diğeri de XSD doğrulaması yapmak için (XsdValidatingReader) - başlatılmasına sebep olur. Buradaki asıl güzellik ise, XmlReader nesneleri ile direkt olarak ilgilenmenize gerek olmadığıdır. Arzularsanız, yine XmlValidatingReader ı programlayabilirsiniz. Fakat tekrar belirtmem gerek, mümkün olduğunca bu factory pattern gerçekten kullanmalısınız.

Framework versiyon 2.0 da, yeni bir kaç doğrulama özelliğide duyuruldu. Bunlardan biri, XmlSchemaValidator isminde yeni bir sınıf; bu sınıf XmlReader için çok da gerekli olmayan özel doğrulama rutinlerini gerçekleştirmek üzere eklendi. Bu sınıf, birçok gelişmiş doğrulama görevlerini yerine getirmek üzere kullanılan push-model API yi sağlar. XmlDocument de, tüm dokümanı ya da doküman şemalarına (yeni Schemas özelliği ile gelir) karşı yalnız özel bir subtree yi doğrulamak için, Validate metotdunu da içererek genişletildi.

Yükleme ve Kaydetme

Çok daha gelişmiş, sofistike navigasyon teknikleri kullanmak için XML dokümanını hafızaya yüklemek istediğinizde, System.Xml size birkaç seçenek sunar. Birincisi, System.Xml, birçok yazılım geliştiricisinin son bir kaç yıldır kullandığı XmlDocument sınıfıyla, W3C Document Object Model (DOM) API nin uygulamasını sağlar.

XmlDocument, metin akışından (XmlReader uygulaması kullanarak) XML dokümanı okumak için Load metodunu çağırır ve onu hafızada ki düğüm ağacına yükler. Yazma (XmlWriter uygulaması kullanarak) işlemleri için de Save metodu sağlanır. Aşağıda, bu işlemlerin nasıl çalıştığını gösteren bir örnek bulacaksınız.

Doküman hafızaya alınır alınmaz, birçok DOM API sini kullanabilir ya da XPathNavigator ile doküman üzerinde gezinebilir hatta güncelleme işlemi yapabilirsiniz. DOM bugün herkes tarafından kabul edilip, geniş bir yalpazede kullanılıyor olsa da, dürüst olmak gerekirse birçok problem için ağır siklet bir seçenektir. Birçok DOM problemi, API nin XML 1.0 ın tüm syntax yapısını (bütün referansların, CDATA bölümlerinin ve daha nicelerinin hafızaya alındığını bir düşünün) kopyalamaya çalışması gerçeğinden kaynaklanır. Bazı doküman merkezli senaryolar (örneğin, bir XML editörü oluşturmak istiyorsanız) için bu kullanılabilir olsa da, veri merkezli senaryolarda (SOAP processing gibi) iş biraz karmaşıklaşır. DOM ayrıca dahili depolomayı düzenlemeyi oldukça zorlaştıran tekil düğümleri direkt olarak yazılım geliştiriciye yansıtır.

Bu yüzden System.Xml, XPathDocument diye bilinen alternatif bir hafıza içi depoyla gelir. XpathDocument, sorgular ve dönüşümler için optimize edilmiş salt okunur bir depodur. XPathNavigator kullanarak XPathDocument e yön belirtebilirsiniz. XPathNavigator nesnesi döndüren CreateNavigator dan başka; XpathDocument sınıfı içinde başka bir yerel metot bulamayacaksınız.

XmlWriter kullanarak dokümanı yazmak için XpathNavigator kullanabilirsiniz. Böylelikle isterseniz, XPathNavigator kullanarak ve XmlWriter.WriteNode u çağırarak yazmak isteğinizi yazarsınız ya da isterseniz, XmlWriter kullanarak ve XPathNavigator.WriteSubtree yi çağırarak yazmak istediğinizi yazarsınız. Aşağıdaki kodda bunun bir uygulamasını göreceksiniz.

XPathNavigator Kullanma
 

XmlDocument üzerinden XpathDocument deposunu kullanmanın getirdiği esas fayda ise özellikle sorgu ve dönüşümler gerçekleştirirken ve üzerinde gezinirken sağladığı hızdır. Emin olun sırf bu hızdan dolayı hafızadaki dokümanı güncellemek için sıklıkla XmlDocument ı kullanacaksnız.

Navigasyon ve Sorgulama

Hafıza deposunda ister XPathDocument ya da XmlDocument kullanın, XPathNavigator doküman içinde navigasyon ve sorgulama için önerilen bir API dir. XPathNavigator, kod ve uygulamanız arasında sizi daha sonra gelecekteki iyileştirmelerinizde avantaj elde etmenize hazırlayarak; ekstra bir abstract katman sağlar.

XPathNavigator farklı eksenler boyunca ilgili depo içinde rahatça gezinebilmeniz için birçok MoveToXXX metodu sağlar. XmlReader gibi XPathNavigator da doküman içinde navigasyon için kursör yaklaşımını kullanır. Düğüm üzerinde konuşlanır konuşlanmaz, onun tüm özelliklerini ve metin değerlerini alabilirsiniz. Versiyon 2.0 da, tip dönüşümlerini kolaylaştırmak için birçok tipde ValueAsXXX özellikleri getirilmiştir. Aşağıdaki örnek, XPathNavigator kullanarak nasıl sipariş toplamı alınabileceğini gösteriyor.

XPathNavigator Kullanarak Sipariş Toplama
 

Bununla beraber yazılım geliştiriciler için doküman içinde gezinmek için XPath ifadeleri kullanmak muhtemelen çok yaygındır. İşte XPathNavigator da birçok Select metodu ile XPath desteği de sağlar. Jenerik Select metodu, XPath ifadesini girdi olarak alır ve uygun düğümleri işlemek için XpathNodeIterator olarak döndürür. Yine aynı şekilde belirli bir eksende sınırlı olarak arama işlemi de gerçekleştirebilen birçok özel Select metodu (SelectAncestors, SelectChildren, SelectDescendants...) da vardır.

System.Xml de, XPathNavigator eşlenen ilk düğümü bulmak için SelectSingleNode metoduyla (aynı XmlDocument de olduğu gibi) da gelir (bu versiyon eşlenmiş düğüm üzerinde konuşlanmış XPathNavigator ı döndürür).

Doğru bir şekilde isim uzayları (namespaces) ile ilgilenmek, XPath kullanmanın en karmaşık yönlerinden biridir. .NET Framewrok 1.1 de, Select i çağırırken, isim uzayı mapping i ile XmlNamespaceManager nesnesini üretmek ve onu sağlamak gerekirdi. Sadece kendi XPath ifadelerinizde XmlNamespaceManager nesnesi içinde bulunan isim uzayı ön eklerini kullanabilirdiniz. Fakat, önseziler birçok yazılım geliştiriciye sorgulama yaptıkları dokümanla gelen isim uzayı mapping lerini kullanmaları gerektiğini söyler.

Bu yüzden System.Xml 2.0 da, Select i çağırırken, isim uzayı çözücüyü belirlemek için overloads eklenmiştir. Bilinen XmlReader sınıfları ve XPathNavigator bütünü ile IXmlNamespaceResolver implemente eder. Bunun anlamı, otomatik olarak isim uzayı mapping leri sağlamak için onları Select üzerinden geçirebilirsiniz. Daha önceden vermiş olduğum Siparis.Xml dosyasını hatırlayacaksınız. Bu dosya, “http://localhost/siparis” isim uzayına “o” öneki ile tasarlanmış bir isim uzayı tanımlamasına sahiptir. Aşağıdaki örnek, elle XmlNamespaceManager nesnesi yaratmadan XPath ifadelerine bu öneki nasıl kullanabileceğinizi gösterir.

Önek Kullanma
 

Şunu da belirtmek gerekir ki; eğer XPath ifadelerinizde boş bir isim uzayından farklı olarak XPath ifadelerinizde önek kullanmıyorsanız, varsayılan isim uzayı mapping i kabul edilir. İşte bu yüzden önceki örneğimde açık bir önek kullanmak gerekti. Yine de bu, birçok genel XPath senaryolarını kolaylaştıracak önemli bir gelişmedir.

Güncelleme

Hafızada yer alan dokümanı değiştirmeniz ya da güncellemeniz gerektiğinde, XPathDocument değiştirilebilir olmadığı için bellek deposu olarak XmlDocument kullanmanız gerekir. Fakat, XmlDocument de güncelleme işlemleri gerçekleştirebilmek için XPathNavigator kullanabilirsiniz. System.Xml 2.0 da, öncelikli değişiklikleri desteklemesi için XPathNavigator a birkaç yeni metot eklenmiştir (versiyon 1.1 de, salt okunur bir API ydi).

Örneğin, değerleri ayarlamak, düğümleri silmek, düğümleri değiştirebilmek, belirli bir düğümden önce veya sonra ekleme yapabilmek gibi işlemler için metotlar bulacaksınız. Daha önceden oluşturulan depoda direkt olarak yeni XML düğümleri yazmada kullanabilmek için; sağlanan birçok method XmlWriter nesnesi döndürür. Örneğin aşağıdaki kod, < Siparis > in son child elementi olarak nasıl < Toplam > elementi yazabileceğinizi gösterir.

Yeni XML Düğümleri Yazma
 

Bu tipte güncellemeler için birçok metot vardır. Eğer DOM API kullanamaya alışıksanız, bu metotlar size başta yabancı gelebilir. Fakat ne olursa olsun onları kullanmanızı öneririm. Eğer kullanırsanız, kodunuz yolun aşağısında yapılan kazı çalışmasındaki değişikliklerden asla etkilenmeyecek ve aynı etkisinde kalacaktır ;)

Dönüştürme

.NET Framework 2.0 da XSLT dönüşümünü çalıştırmanız gerektiğinde, iki seçeneğe sahipsiniz. İlki, 1.1 versiyonundaki XslTransform sınıfı hala mevcut ve aynı önceden olduğu gibi çalışıyor. System.Xml 2.0, dizayn olarak XslTransform (sınıflar arasındaki geçişi kolaylaştıran) ile aynı olan ama büyük performans gelişimiyle birlikte gelen XslCompiledTransform adında yeni bir sınıf getirdi.

XslCompiledTransform ile gelen esas fayda ise, dönüşüm işlemine başlamadan önce MSIL içinde XSLT i derlemesidir. Bu yükleme zamanını artırır fakat dönüşüm işleme hızını inanılmaz biçimde arttırır. Aşağıdaki kodda bunun nasıl kullanılacağını görebilirsiniz. Buradaki önemli nokta ise, yeni XSLT engine inin birçok MSXML XPath ilave fonksiyonlarını da desteklemesidir.

XslCompiledTransform Kullanma
 

Özet

Bu serinin ikinci ve son makalesinde, daha çok XML in yazma, doğrulama, sorgulama, yükleme, kaydetme gibi işlemleri üzerinde yoğunlaşarak yeniliklerin getirdiği kolaylıklara hep birlikte baktık ve System.Xml 2.0 ın, sağladığı birçok yenilik ve geliştirilen birçok yeni metodun işlerimizi nasıl kolaylaştırdığını ve güvenli bir şekilde hızlandırdığını gördük. System.Xml 2.0 performansı ve verimliliği arttırıcı birçok gelişme sağlıyor. Kütüphanesi, genel XML görevleri için açık çözümler getiriyor ve gerçekten nesneleri basitleştirmeye çalışıyor. Özet olarak, iki makaleden oluşan bu seride neler üzerinden geçtiğimize birkaç öneride bulunarak değinelim.

  • Doğrulama gibi şeylerde desteğe ihtiyacınız olduğu zaman bile okuyucu ve yazıcı yaratmak için her zaman statik Create factory metotlarını kullanın.
  • Eğer gerçekten performans ile ilgileniyorsanız, doküman içinde sorgulama ve dönüşüm işlemlerinde bellek deposu olarak her zaman XPathDocument i kullanmalısınız.
  • Değiştirebilir bir depoya ihtiyacınız olduğunda sadece XmlDocument i kullanın. Yalnız bir tanesine ihtiyacınız olursa, güncelleme mantığı yazmak için XPathNavigator kullanın.
  • Eğer gerçekten performansı kafaya takmışsanız, XSLT dönüşümlerini başlatmak için her zaman XslCompiledTransform kullanın.
  • Kodunuzu basitleştirmek için size sunulmuş olan birçok API gelişmesinden gerçekten avantaj sağlayın.
Bu makalede okuduklarınızı kullanarak, birçok performans gelişiminden yarar sağlayacak ve ileriki yıllar için kodunuzun taşınması ve sürekliliğinin sağlaması gerçekten çok kolay olacak.

Kaynak: MSDN

Bir sonraki makalelerde görüşmek üzere. İyi çalışmalar...


Tayfun AKCAY

tayfun@tayfunakcay.com