XML Tree functional construction is a great stuff and definitely a big improvement over the upside down DOM-style XML building. I only wanted to note that one doesn't have to wait years for C# 3.0 to be able to build XML tree in a natural top-down way, that was actually possible from the very beginning (here is .NET 2.0 sample, in .NET 1.X one would need XmlNodeWriter):
XmlDocument doc = new XmlDocument();
XmlWriter w = doc.CreateNavigator().AppendChild();
w.WriteStartElement("contacts");
w.WriteStartElement("contact");
w.WriteElementString("name", "Patrick Hines");
w.WriteStartElement("phone");
w.WriteAttributeString("type", "home");
w.WriteString("206-555-0144");
w.WriteEndElement();
w.WriteStartElement("phone");
w.WriteAttributeString("type", "work");
w.WriteString("425-555-0145");
w.WriteEndElement();
w.WriteStartElement("address");
w.WriteElementString("street1", "123 Main St");
w.WriteElementString("city", "Mercer Island");
w.WriteElementString("state", "WA");
w.WriteElementString("postal", "68042");
w.WriteEndElement();
w.WriteEndElement();
w.WriteEndElement();
w.Close();
Should admit XLinq's functional construction still looks shorter and tree-friendly, but it is seriously constrained to building only XLinq XML tree in-memory. If one day you decide that building in-memory XML tree just to be saved to a disk is a waste of memory (and it is a waste), you would need to rewrite completely XML construction code and that's bad. XmlWriter has no limits here - you can use it for building XML tree in memory or writing XML directly to a stream in a fast efficicent non-caching way. XmlWriter just does its job - writes XML with no coupling to the result and that's way any code that produces XML with XmlWriter is more reusable.
Ergo - please don't repeat System.Xml mistakes and treat XmlWriter as a first class citizen - provide a way to build XDocument/XElement with XmlWriter, that will be good architecturally and will provide smoother migration from XmlDocument v2. E.g. what about providing an editable XPathNavigator over XElement or XDocument?
Update. And as a matter of interest XQuery being truly functional language of course supports functional composition too. Here is a sample:
element book {
attribute isbn {"isbn-0060229357" },
element title { "Harold and the Purple Crayon"},
element author {
element first { "Crockett" },
element last {"Johnson" }
}
}
Looks terribly familiar, huh?
But as Erik pointed out in comments neither form of composition can beat the ultimate way of building XML - literal one. Here is how it looks like in XQuery:
<example>
<p> Here is a query. </p>
<eg> $b/title </eg>
<p> Here is the result of the query. </p>
<eg>{ $b/title }</eg>
</example>
C# doesn't support it yet, while VB sort of does. "Sort of" because VB form of "literal XML" is not actually XML, but confusing ASP-like mess. But I'll address that later.
To be continued...