XmlSerializer mengharuskan kita mendefinisikan class pemetaan. Pendekatan itu tidak selalu perlu: XmlWriter menulis token XML satu per satu, sedangkan XmlReader membaca dokumen maju terus (forward-only) tanpa memuat seluruh pohon ke memori. Pasangan ini bekerja di namespace System.Xml dan menjadi pilihan hemat memori untuk dokumen besar seperti ekspor ribuan baris, karena konsumsi memorinya tetap sepanjang ukuran dokumen.

Contoh berikut menulis satu dokumen pesanan, lalu membaca ulang isi elemennya:

csharp
var settings = new XmlWriterSettings { Indent = true };
var buffer = new StringBuilder();

using (XmlWriter writer = XmlWriter.Create(buffer, settings))
{
    writer.WriteStartElement("pesanan");
    writer.WriteElementString("nomor", "INV-001");
    writer.WriteElementString("total", "125000");
    writer.WriteEndElement();
}

Console.WriteLine(buffer.ToString());

using XmlReader reader = XmlReader.Create(new StringReader(buffer.ToString()));
while (reader.Read())
{
    if (reader.NodeType == XmlNodeType.Element && reader.Name != "pesanan")
    {
        string nama = reader.Name;
        string isi = reader.ReadElementContentAsString();
        Console.WriteLine($"{nama} = {isi}");
    }
}

Output yang Dihasilkan:

xml
<?xml version="1.0" encoding="utf-16"?>
<pesanan>
  <nomor>INV-001</nomor>
  <total>125000</total>
</pesanan>

Bagian pembacaan menghasilkan:

text
nomor = INV-001
total = 125000

Mari kita bedah bagian pentingnya:

  1. XmlWriterSettings { Indent = true }: mengaktifkan indentasi agar dokuman mudah dibaca; untuk payload produksi, indentasi hanya memperbesar ukuran.
  2. WriteStartElement … WriteEndElement: writer menjaga tumpukan elemen, sehingga struktur <pesanan> menutup dengan benar secara otomatis.
  3. while (reader.Read()): reader maju node demi node: deklarasi XML, elemen akar, lalu elemen anak.
  4. Filter NodeType dan Name: hanya node Element selain akar yang diproses, sehingga deklarasi dan teks spasi putih terlewati.
  5. ReadElementContentAsString: method tersebut membaca seluruh isi elemen saat ini dan memajukan reader ke node berikutnya; nama elemen karenanya disimpan dulu di variabel nama sebelum isi dibaca.

Kedua class juga menerima XmlReaderSettings dan XmlWriterSettings untuk menyetel perilaku seperti indentasi, penanganan spasi putih, dan pemeriksaan kesesuaian karakter. Dengan settings yang disimpan sebagai satu objek konfigurasi, dokumen yang ditulis dan dibaca aplikasi selalu mengikuti aturan yang sama.