Czym jest LINQ to XML

C# LINQ to XML – jak wygenerować XML z CSV (XDocument)

C# LINQ to XML – jak wygenerować XML z CSV (XDocument)

Potrzebujesz przekształcić dane z CSV do XML w C#?
W tym artykule pokażę, jak wykorzystać LINQ to XML, aby w prosty i kontrolowany sposób generować strukturę XML przy użyciu XDocument i XElement.
To podejście świetnie sprawdza się w integracjach systemów, eksportach danych oraz scenariuszach ETL.


📌 Czym jest LINQ to XML i kiedy go używać?

LINQ to XML to API dostępne w .NET (System.Xml.Linq), które pozwala tworzyć i manipulować XML-em w sposób deklaratywny.

Kiedy warto używać?

  • integracje z systemami zewnętrznymi (SOAP, B2B)
  • eksport danych (np. do hurtowni danych)
  • transformacje danych (CSV → XML)
  • generowanie dynamicznych dokumentów XML

Kiedy NIE?

  • bardzo duże pliki (problem z pamięcią)
  • streaming danych → wtedy lepszy XmlReader / XmlWriter

🏗️ Scenariusz: CSV → XML w C#

Założenie:
Masz dane w CSV (np. samochody) i chcesz wygenerować XML:

<Samochody>
   <Samochod>
      <Model>Prius</Model>
      <SpalanieAutostrada>5</SpalanieAutostrada>
   </Samochod>
</Samochody>

🧱 Tworzenie XML krok po kroku (XDocument)

1. Dodanie przestrzeni nazw

using System.Xml.Linq;

2. Utworzenie dokumentu XML

var dokument = new XDocument();

👉 Tworzysz pusty dokument, do którego będziesz dodawał elementy.


3. Element główny

var samochody = new XElement("Samochody");

👉 To root Twojego XML-a.


4. Iteracja po danych (foreach)

foreach (var rekord in rekordy)
{
    var samochod = new XElement("Samochod");

    var model = new XElement("Model", rekord.Model);
    var spalanieAutostrada = new XElement("SpalanieAutostrada", rekord.SpalanieAutostrada);

    samochod.Add(model);
    samochod.Add(spalanieAutostrada);

    samochody.Add(samochod);
}

Co tu się dzieje?

  • XElement automatycznie konwertuje typy (int → string)
  • budujesz strukturę imperatywnie (krok po kroku)
  • masz pełną kontrolę nad XML

5. Dodanie roota do dokumentu

dokument.Add(samochody);

6. Zapis do pliku

dokument.Save("paliwo.xml");

👉 Domyślnie zapisze do katalogu bin/Debug


⚡ Alternatywa: podejście deklaratywne (LINQ style)

W produkcji często lepsze:

var dokument = new XDocument(
    new XElement("Samochody",
        rekordy.Select(rekord =>
            new XElement("Samochod",
                new XElement("Model", rekord.Model),
                new XElement("SpalanieAutostrada", rekord.SpalanieAutostrada)
            )
        )
    )
);

✅ Zalety

  • mniej kodu
  • bardziej czytelne dla doświadczonych devów

❌ Wady

  • trudniejsze do debugowania
  • mniej “step-by-step” dla juniorów

🆚 Elementy vs Atrybuty – co wybrać?

✔ Elementy (zalecane na start)

<Model>Prius</Model>

Plusy:

  • łatwiejsze rozszerzanie
  • lepsza czytelność
  • bardziej “future-proof”

✔ Atrybuty

<Samochod Model="Prius" />

Plusy:

  • krótszy zapis
  • dobre dla prostych danych

📌 Best Practice

👉 Jeśli nie masz constraintów:
zacznij od elementów


⚠️ Performance – ważny edge case

LINQ to XML:

  • ładuje cały dokument do pamięci ❗
  • nie nadaje się do dużych plików

Alternatywa:

  • XmlWriter → zapis strumieniowy
  • XmlReader → odczyt strumieniowy

🧩 Clean Architecture – gdzie to umieścić?

Nie wrzucaj tego do Main w realnym projekcie.

✔ Poprawne podejście:

public interface IXmlExporter
{
    void Export(IEnumerable<Car> cars);
}
public class XmlExporter : IXmlExporter
{
    public void Export(IEnumerable<Car> cars)
    {
        var doc = new XDocument(
            new XElement("Samochody",
                cars.Select(c =>
                    new XElement("Samochod",
                        new XElement("Model", c.Model)
                    )
                )
            )
        );

        doc.Save("paliwo.xml");
    }
}

📌 Dlaczego?

  • separacja odpowiedzialności
  • testowalność
  • łatwa wymiana implementacji

✅ Checklist – co zapamiętać

  • XDocument = cały dokument
  • XElement = pojedynczy element
  • LINQ to XML = wygoda + czytelność
  • duże pliki → użyj XmlWriter
  • trzymaj to w Infrastructure
  • elementy > atrybuty (na start)

🔗 Zobacz też


📣 Call To Action

Jeśli materiał był pomocny:

👉 zostaw komentarz – jak używasz XML w swoich projektach
👉 sprawdź inne artykuły o .NET i architekturze


Zobacz także — powiązane artykuły

👉 Tworzenie klas i obiektów w C# — kompletny przewodnik

👉LINQ w C# — przetwarzanie kolekcji bez pętli – zobacz w kursie LINQ w C# -czytelny kod, wydajne zapytania

👉 Typy wartościowe vs referencyjne w C# — jak działa pamięć – zobacz w kursie C# Podstawy Programowania: Twój Pierwszy Krok w Świat Kodowania

Dołącz do Listy VIP

I otrzymaj roadmapę Junior .NET Developer oraz najlepszą ofertę, gdy tylko ruszą zapisy!!!

Kontakt: mariuszjurczenko@dev-hobby.pl
Zero spamu. Możesz wypisać się w każdej chwili.

Dodaj komentarz