DSO.Core.XmlSafeReader · .NET

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.

0Harici Bağımlılık
MITLisans
Sync + AsyncAPI Desteği
Problem

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.
"Bütün XML'i analiz etmek yerine, ihtiyaç duyduğunuz bölümü alın."
Yaklaşım
XmlReader — streaming başlar
Target Matching — element adı / tam path
Subtree Parsing — yalnızca hedef alt ağaç
XElement — sonuç materialize edilir
Tasarım Felsefesi

Üç adımlı, sıralı bir okuma stratejisi.

01 / Streaming First

Önce ileri doğru oku

XML, mümkün olduğunca XmlReader üzerinden ileri yönlü akış halinde okunur; belge önceden DOM'a çevrilmez.

02 / Selective Parsing

Sonra hedefi seç

İhtiyaç duyulan element bulunduğunda ReadSubtree() ile yalnızca ilgili bölüm ayrı şekilde işlenir.

03 / Safe Materialization

En son somutlaştır

Sonuç, yalnızca gerçekten ihtiyaç duyulduğu noktada XElement haline getirilir.

Öne Çıkan Özellikler

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
Kullanım

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");
Internal Architecture

İki yöntem, tek amaç.

Yöntem 1

Selective XML Reading

Input (file / stream / bytes / string)
XmlReader
Target · Path · Exclude Matching
ReadSubtree()
XElement
Yöntem 2

Full XML Reading

Input
StreamReader
Safe UTF-8 Pipeline (BOM detection)
MemoryStream → XmlReader
XElement

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.

Kullanım Senaryoları

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.

Envelope › Body › Response › Invoice

E-Fatura / UBL

Signature ve UBLExtensions gibi ağır bölümleri exclusion ile atlayıp yalnızca fatura gövdesini işleyin.

Invoice › Supplier, Customer, Tax, Lines
Signature, Extensions

Büyük XML Import

Yüzlerce megabaytlık bir belgede hedef arama + ReadSubtree ile gereksiz DOM materialization'ı azaltın.

XmlReader → Target Search → ReadSubtree

XML Configuration

connectionStrings, appSettings, services gibi bölümleri tüm configuration'ı yüklemeden okuyun.

Application XML › connectionStrings

Database'den XML

Veritabanından byte[] veya Stream olarak gelen XML'i doğrudan aktarın.

DB column → byte[] / Stream → XmlSafeReader

Namespace'li Belgeler

soap:, cac: gibi namespace önekleri taşıyan enterprise XML mesajlarıyla çalışır.

soap:Envelope › soap:Body › cac:Invoice
Karşılaştırma

Klasik XDocument / XElement yaklaşımına karşı.

ÖzellikKlasik DOMXmlSafeReader
Tüm XML'i yüklemezorunluisteğe bağlı
Streaming parsingyokvar
Selective targetyokvar
Path-based targetyokvar
Element / attribute excludemanuelyerleşik
SkipAsync() desteğiyokvar
ReadSubtree() desteğiyokvar
Stream / byte[] APImanuelyerleşik
Async APIsınırlıtam destek
Çoklu target & birleştirilmiş sonuçmanuelyerleşik
Configuration helper'laryokvar
Harici bağımlılıkyokyok
Kurulum & Hızlı Başlangıç

Tek dosya, sıfır bağımlılık.

  1. Dosyayı projeye ekleyin

    XmlSafeReader.cs dosyasını projenize kopyalayın; ayrı bir paket kurulumu gerekmez.

  2. Namespace'i içe aktarın

    using DSO.Core.XmlSafeReader;
  3. Standart .NET API'lerine dayanır

    Alt yapı doğrudan System.Xml, System.Xml.Linq ve System.Text üzerine kuruludur — üçüncü parti bir XML framework'ü gerekmez.

  4. 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)
Temel Prensip

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.