Open XML Programmierung wird einfacher mit LINQ to XML

Wer ist der größte Pioneer der Programmiersprachen? Bill Gates? Nikolaus Wirth? Für mich ist und war es immer Anders Hejlsberg, dessen Name für Turbo Pascal, Delphi und C# steht. Die neueste Erfindung trägt den Namen Language Integrated Query Framework, oder kurz LINQ. Mit LINQ wird der Abstand zwischen dem Umgang mit Daten und der eigentlichen Programmiersprache wieder kleiner und gerade in Bezug auf XML, speziell Open XML, ist es sehr gut zu gebrauchen, um den Umgang mit den Daten einfacher und verständlicher zu machen.

Ein Beispiel: Wenn wir dieses XML Document erzeugen müßten:

<worksheet xmlns="https://schemas.openxmlformats.org/spreadsheetml/2006/main">

<sheetData>

<row r="1">

<c r="A1" t="inlineStr">

<is>

<t>Sample Text</t>

</is>

</c>

</row>

</sheetData>

</worksheet>

 

dann könnte das - getan mit dem XML DOM - etwa so aussehen: 

 

 

const string spreadsheetML = @"https://schemas.openxmlformats.org/spreadsheetml/2006/main";

XmlDocument xDocWS = new XmlDocument();

XmlElement tagWorksheet = xDocWS.CreateElement("worksheet", spreadsheetML);

xDocWS.AppendChild(tagWorksheet);

XmlElement tagSheetData = xDocWS.CreateElement("sheetData", spreadsheetML);

tagWorksheet.AppendChild(tagSheetData);

XmlElement tagRow = xDocWS.CreateElement("row", spreadsheetML);

tagRow.SetAttribute("r", GetRowNumber(cellAddress));

tagSheetData.AppendChild(tagRow);

XmlElement tagCell = xDocWS.CreateElement("c", spreadsheetML);

tagCell.SetAttribute("r", cellAddress);

tagCell.SetAttribute("t", "inlineStr");

XmlElement tagIS = xDocWS.CreateElement("is", spreadsheetML);

tagCell.AppendChild(tagIS);

XmlElement tagText = xDocWS.CreateElement("t", spreadsheetML);

tagText.InnerText = cellValue;

tagIS.AppendChild(tagText);

tagRow.AppendChild(tagCell);

 

Der hierarchische Aufbau geht völlig verloren und damit auch schnell der Überblick. Man muß immer darauf achten, was man wo anhängt. Mit LINQ to XML wird es dagegen viel übersichlicher:

XNamespace ns = @"https://schemas.openxmlformats.org/spreadsheetml/2006/main";

XDocument xdocWS =

  new XDocument(

    new XElement(ns + "worksheet",

      new XElement(ns + "sheetData",

        new XElement(ns + "row",

          new XAttribute("r", "1"),

          new XElement(ns + "c",

            new XAttribute("r", "A1"),

            new XAttribute("t", "inlineStr"),

            new XElement(ns + "is",

              new XElement(ns + "t", "Sample Text")

              )

            )

          )

        )

      )

    );

Der hierarchische, geschachtelte Aufbau fällt sofort ins Auge und die Tatsache, daß Attribute in einem Zug angelegt und mit einem Wert versehen werden können, erspart viel Zeit. Auch der Umgang mit Namespaces wird einfacht.

LINQ wird im .NET Framework 3.5 (Visual Studio Codename "ORCAS") enthalten sein. Es lohnt sich, schon jetzt einen Blick darauf zu werfen.