Ziel dieses HowTo’s ist es, mehrere Daten aus einem Service (hier in dem Beispiel aus einem Mock) via LINQ in eine XML zu schreiben (serialisieren).

Die XML soll folgendermaßen aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Localization>
  <Module id="Customers">
    <CultureCode>de-DE</CultureCode>
    <Key>General</Key>
    <Value>Allgemein</Value>
  </Module>
  <Module id="Customers">
    <CultureCode>en-EN</CultureCode>
    <Key>General</Key>
    <Value>General</Value>
  </Module>
  <Module id="Customers">
    <CultureCode>de-DE</CultureCode>
    <Key>Customer</Key>
    <Value>Kunde</Value>
  </Module>
</Localization>

Dazu inizialisiere ich mir zu erst den Datenpool, in diesem Fall benutze ich eine Klasse die mir ein paar Mock-Objekte bereitstellt.

1
LocalizationServiceMock lm = new LocalizationServiceMock();

Dann erstelle ich mir das erste XML Element „Localization“, welches weitere Elemente beinhalten soll.

1
XElement moduleElement = new XElement("Localization");

Nun iteriere ich durch die Liste von Objekten die ich von meinem Mock bekomme und füge dem oben erstellten „moduleElement“ die Daten aus dem Mock, als jeweils neues Element hinzu.

1
2
3
4
5
6
7
8
9
foreach (LocalizationServiceMock.TranslatedString translatedString in lm.GetTranslatedStrings())
{
  moduleElement.Add(new XElement("Module", new XAttribute("id", translatedString.Module),
        new XElement("CultureCode", translatedString.CultureCode),
        new XElement("Key", translatedString.Key),
        new XElement("Value", translatedString.Value)
        )
  );
}

Zum Schluss wird das Ganze noch in ein XDocument geschrieben

1
2
3
4
var localizationService = new XDocument(
  new XDeclaration("1.0", "UTF-8", "yes"),
    moduleElement
 );

und gespeichert:

1
localizationService.Save("Services/LocalizationService.xml");

Fertig sieht das folgendermaßen aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void WriteXml()
{
  LocalizationServiceMock lm = new LocalizationServiceMock();
  XElement moduleElement = new XElement("Localization");
 
  foreach (LocalizationServiceMock.TranslatedString translatedString in lm.GetTranslatedStrings())
  {
    moduleElement.Add(new XElement("Module", new XAttribute("id", translatedString.Module),
          new XElement("CultureCode", translatedString.CultureCode),
          new XElement("Key", translatedString.Key),
          new XElement("Value", translatedString.Value)
          )
    );
  }
  var localizationService = new XDocument(
    new XDeclaration("1.0", "UTF-8", "yes"),
      moduleElement
   );
  localizationService.Save("Services/LocalizationService.xml");
}

Viel Spass beim entwickeln : )

Mit LINQ2XML innerhalb einer foreach serialisieren
Markiert in: