XML'in tamamına
ihtiyacınız yoksa,
tamamını yüklemeyin.
XmlSafeReader, büyük XML belgelerinde yalnızca ihtiyaç duyulan bölümü XmlReader üzerinden akış (streaming) halinde okuyan, hedef elementleri seçen ve istenmeyen kısımları parse etmeden atlayan hafif bir .NET kütüphanesidir. Harici bağımlılık yok.
Klasik XDocument.Load() her şeyi belleğe alır.
- XML belgesi birkaç yüz megabayta ulaşabilir.
- İçinde uygulamanın hiç kullanmadığı binlerce element bulunabilir.
- SOAP zarfı veya UBL fatura yapısı gibi karmaşık hiyerarşiler taşıyabilir.
- Aynı element adı belgede defalarca tekrar edebilir.
- Signature, Attachment gibi bölümlerin tamamen atlanması gerekebilir.
Üç adımlı, sıralı bir okuma stratejisi.
Önce ileri doğru oku
XML, mümkün olduğunca XmlReader üzerinden ileri yönlü akış halinde okunur; belge önceden DOM'a çevrilmez.
Sonra hedefi seç
İhtiyaç duyulan element bulunduğunda ReadSubtree() ile yalnızca ilgili bölüm ayrı şekilde işlenir.
En son somutlaştır
Sonuç, yalnızca gerçekten ihtiyaç duyulduğu noktada XElement haline getirilir.
Tek amaca odaklanan, geniş bir yüzey alanı.
Hedefleme
- Belirli elementleri seçerek okuma
- Birden fazla target element
- Tam XML path ile hedefleme
- Namespace destekli path eşleştirme
Filtreleme
- Element exclusion
- Attribute exclusion
- SkipAsync() ile gereksiz alt ağacı atlama
- Birden fazla sonucu tek XElement'te birleştirme
Kaynak Türleri
- Dosyadan okuma
- Stream üzerinden okuma
- byte[] üzerinden okuma
- String XML okuma
Çalışma Modeli
- Async API — XmlReader.ReadAsync()
- Sync API
- .NET XmlReader altyapısı
- Düşük gereksiz memory allocation hedefi
Encoding
- UTF-8 desteği
- BOM detection
- Kontrollü invalid byte davranışı
- Kontrollü XmlException handling
Konfigürasyon
- Application configuration XML desteği
- Project setting okuma
- Section bazlı configuration okuma
- Harici XML framework bağımlılığı yok
Aynı mantık, farklı kaynaklar için.
Bir XML dosyasından tek bir elementi almanın en kısa yolu.
XElement? invoice = await XmlSafeReader.ReadSectionAsElementAsync( "invoice.xml", "Invoice"); // senkron karşılığı XElement? invoiceSync = XmlSafeReader.ReadSectionAsElement( "invoice.xml", "Invoice");
Signature ve Attachment gibi büyük alt ağaçları parse etmeden SkipAsync() ile atlayın.
XElement? invoice = await XmlSafeReader.ReadSectionWithExcludesAsync( "invoice.xml", new[] { "Invoice" }, "Signature", "Attachment"); // Invoice // ├── Header // ├── Customer // ├── Lines // ├── Signature ← çıkarılır // └── Attachment ← çıkarılır
HTTP response, FileStream, MemoryStream veya database blob — hepsi aynı pipeline'dan geçer.
await using Stream stream = GetXmlStream(); XElement? result = await XmlSafeReader.ReadSectionAsElementAsync( stream, "Invoice");
Database binary alanları, web servis yanıtları veya SOAP mesajları için byte[]; doğrudan metin için string.
byte[] xmlBytes = GetXmlBytes(); XElement? fromBytes = await XmlSafeReader.ReadSectionAsElementAsync( xmlBytes, "Invoice"); // string XML — StringReader üzerinden XmlReader'a aktarılır string xml = GetXml(); XElement? fromString = await XmlSafeReader.ReadSectionWithExcludesAsync( xml, new[] { "Invoice" });
Birden fazla hedef verin ya da aynı isimli elementleri tam XML path ile ayırt edin.
string[] targets = { "Invoice", "Customer", "Order" }; XElement? merged = await XmlSafeReader.ReadSectionWithExcludesAsync( "document.xml", targets); // Envelope/Body/Invoice gibi tam path ile hedefleme // aynı isimde farklı elementler arasında ayrım sağlar XElement? scoped = await XmlSafeReader.ReadSectionWithExcludesFromPathAsync( "document.xml", new[] { "Envelope/Body/Invoice" });
Uygulama configuration XML'ini tamamen veya bölüm bazlı okuyun.
XElement settings = await XmlSafeReader.GetProjectSettingAsync(); // yalnızca connectionStrings bölümünü al XElement? section = await XmlSafeReader.ReadSectionFromProjectSettingAsync( "connectionStrings");
İki yöntem, tek amaç.
Selective XML Reading
Full XML Reading
Performans için kullanılan primitive'ler
Exclude isimleri için liste taraması yerine HashSet<string> tabanlı arama; DOM yerine XmlReader ile streaming; hedef bulunduğunda ReadSubtree(); hariç tutulan bölümlerde tam parse yerine SkipAsync(); dosya ve reader işlemlerinde asenkron I/O.
Enterprise XML'in yoğun olduğu yerler için.
SOAP Response
Envelope/Body içinden yalnızca gerçek yanıt elementini çıkarın, zarfın geri kalanını yüklemeyin.
E-Fatura / UBL
Signature ve UBLExtensions gibi ağır bölümleri exclusion ile atlayıp yalnızca fatura gövdesini işleyin.
Signature, Extensions
Büyük XML Import
Yüzlerce megabaytlık bir belgede hedef arama + ReadSubtree ile gereksiz DOM materialization'ı azaltın.
XML Configuration
connectionStrings, appSettings, services gibi bölümleri tüm configuration'ı yüklemeden okuyun.
Database'den XML
Veritabanından byte[] veya Stream olarak gelen XML'i doğrudan aktarın.
Namespace'li Belgeler
soap:, cac: gibi namespace önekleri taşıyan enterprise XML mesajlarıyla çalışır.
Klasik XDocument / XElement yaklaşımına karşı.
| Özellik | Klasik DOM | XmlSafeReader |
|---|---|---|
| Tüm XML'i yükleme | zorunlu | isteğe bağlı |
| Streaming parsing | yok | var |
| Selective target | yok | var |
| Path-based target | yok | var |
| Element / attribute exclude | manuel | yerleşik |
| SkipAsync() desteği | yok | var |
| ReadSubtree() desteği | yok | var |
| Stream / byte[] API | manuel | yerleşik |
| Async API | sınırlı | tam destek |
| Çoklu target & birleştirilmiş sonuç | manuel | yerleşik |
| Configuration helper'lar | yok | var |
| Harici bağımlılık | yok | yok |
Tek dosya, sıfır bağımlılık.
-
Dosyayı projeye ekleyin
XmlSafeReader.csdosyasını projenize kopyalayın; ayrı bir paket kurulumu gerekmez. -
Namespace'i içe aktarın
using DSO.Core.XmlSafeReader; -
Standart .NET API'lerine dayanır
Alt yapı doğrudan
System.Xml,System.Xml.LinqveSystem.Textüzerine kuruludur — üçüncü parti bir XML framework'ü gerekmez. -
Okumaya başlayın
En basit çağrı ile bir dosyadan hedef elementi alın, ihtiyaç arttıkça exclude, stream veya path tabanlı hedeflemeye geçin.
// en basit kullanım XElement? invoice = await XmlSafeReader.ReadSectionAsElementAsync( "invoice.xml", "Invoice"); // exclude ile XElement? filtered = await XmlSafeReader.ReadSectionWithExcludesAsync( "invoice.xml", new[] { "Invoice" }, "Signature", "Attachment"); // sonuç üzerinde standart LINQ to XML string? name = invoice?.Element("Customer")? .Element("Name")?.Value;
Selective Reading
ReadSectionAsElement(Async)
ReadSectionWithExcludes(Async)
ReadSectionWithExcludesFromPathAsync
Configuration
GetProjectSetting(Async)
GetAppSetting(Async)
GetAppSettingWithFileNameAsync
ReadSectionFromProjectSetting(Async)
XML'in tamamına ihtiyacınız yoksa, tamamını materialize etmeyin.
XmlSafeReader; XmlReader, XElement, XNamespace ve UTF8Encoding gibi .NET'in mevcut altyapısını yeniden icat etmeden, XML okumayı daha kontrollü hale getirir.