public static string ToXml(IDictionary<string, object> dictionary, string elementName)
{
string attributes = dictionary.Where(kvp => kvp.Key.EndsWith(AttributeMarker)).Aggregate<KeyValuePair<string, object>, string>(null, (current, kvp) => current + string.Format(" {0}=\"{1}\"", kvp.Key.Replace(AttributeMarker, string.Empty), kvp.Value));
var stringBuilder = new StringBuilder("<{0}{1}>".Fmt(elementName, attributes));
foreach (var kvp in dictionary.Where(k => !k.Key.EndsWith(AttributeMarker)))
{
if (kvp.Value is IDictionary<string, object>)
stringBuilder.Append(ToXml((IDictionary<string, object>)kvp.Value, kvp.Key));
else if (kvp.Value is dynamic[])
{
foreach (var dyn in (dynamic[])kvp.Value)
{
stringBuilder.Append(ToXml(dyn, kvp.Key));
}
}
else if (kvp.Value.GetType().IsArray || (kvp.Value.GetType().IsGenericType && kvp.Value is IEnumerable))
{
foreach (var value in (IEnumerable)kvp.Value)
{
stringBuilder.Append("<{0}>{1}</{0}>".Fmt(kvp.Key, value));
}
}
else
stringBuilder.Append("<{0}>{1}</{0}>".Fmt(kvp.Key, kvp.Value));
}
stringBuilder.Append("</{0}>".Fmt(elementName));
return stringBuilder.ToString();
}