The following custom XmlNodeConverter will serialize arrays under a single node, with each array element assigned a specified name. Given you don't know the incoming data, you could opt for a generic name like "Element", in which case your example json would translate to:
<Children>
<Element>
<Name>Christine</Name>
</Element>
<Element>
<Name>Kiara</Name>
</Element>
</Children>
The custom XmlNodeConverter:
public class SingleArrayNodeXmlConverter : XmlNodeConverter
{
public string ArrayElementName { get; set; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var token = JObject.Load(reader);
InjectArrayElements(token, ArrayElementName);
var innerReader = token.CreateReader();
innerReader.Read();
return base.ReadJson(innerReader, objectType, existingValue, serializer);
}
private static void InjectArrayElements(JToken token, string elementName)
{
foreach (var childToken in token)
{
InjectArrayElements(childToken, elementName);
}
if (token.Type == JTokenType.Array)
{
var arrayHolder = new JObject { { elementName, token } };
token.Replace(arrayHolder);
}
}
}
Usage:
var converter = new SingleArrayNodeXmlConverter
{
DeserializeRootElementName = "Root",
WriteArrayAttribute = false,
ArrayElementName = "Element"
};
return (XmlDocument)JsonConvert.DeserializeObject(json, typeof(XmlDocument), converter);
This solution is obviously a compromise, but in our situation even a generic array element is better than repeating the array node itself.