How can I change this StringBuilder-to-XML code to LINQ-to-XML?

c#, linq, stringbuilder

Solution

Even without LINQ, you shouldn't write xml via concatenation... `XmlWriter` would be a good fit:

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.NewLineHandling = NewLineHandling.Entitize;
    settings.Indent = true;
    settings.IndentChars = "\t";

    StringBuilder sb = new StringBuilder();
    using (XmlWriter xw = XmlWriter.Create(sb, settings))
    {
        xw.WriteStartDocument();
        xw.WriteStartElement(_pluralCamelNotation);
        for (int i = 0; i < 3; i++)
        {
            xw.WriteStartElement(_singularCamelNotation);
            foreach (DataType dataType in _allDataTypes)
            {
                xw.WriteElementString(dataType.ToString(),
                    dataType.GetDummyData());
            }
            xw.WriteEndElement();
        }
        xw.WriteEndElement();
        xw.WriteEndDocument();
        xw.Close();
    }

You can use `XmlWriterSettings` to control things like line spacing.

Alternatively, with LINQ-to-XML:

    XDocument doc = new XDocument(
        new XDeclaration("1.0", null, null),
        new XElement(_pluralCamelNotation, 
            Enumerable.Range(1,3).Select(
                i => new XElement(_singularCamelNotation,
                    _allDataTypes.Select(
                        dataType => new XElement(
                            dataType.ToString(),
                            dataType.GetDummyData())
                    )
            ))));

    string t = doc.ToString();

Problem

In my application I build an XML file with this code using StringBuilder: ``` StringBuilder sb = new StringBuilder(); sb.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>" + Environment.NewLine); sb.Append(String.Format("<{0}>{1}", _pluralCamelNotation, Environment.NewLine)); for (int index = 0; index < 3; index++) { sb.Append(String.Format("\t<{0}>{1}", _singularCamelNotation, Environment.NewLine)); foreach (DataType dataType in _allDataTypes) { sb.Append(String.Format("\t\t<{0}>{2}</{0}>{1}", dataType.CamelCaseNotation, Environment.NewLine, dataType.GetDummyData())); } sb.Append(String.Format("\t</{0}>{1}", _singularCamelNotation, Environment.NewLine)); } sb.Append(String.Format("</{0}>{1}", _pluralCamelNotation, Environment.NewLine)); return sb.ToString(); ``` How can I do the same thing with LINQ, something like this: ``` PSEUDO-CODE: var xdoc = new XDocument( new XDeclaration("1.0", "utf-8", null), for (int index = 0; index < 3; index++) { new XElement(_pluralCamelNotation, _allDataTypes.Select(datatype => new XElement(_singularCamelNotation, new XElement(datatype.CamelCaseNotation, datatype.GetDummyData()) )) ) } ); ```

Original source