using System.Collections.Generic;
using System.Diagnostics;
public static class XmlPremOutHelper
public static void ReorderPremiumElements(TextReader from, TextWriter to)
var doc = XDocument.Load(from);
foreach (var node in doc.Descendants("PREMout"))
var g = node.Elements().GroupBy(e => e.Name);
public static void GroupPremiumElements(TextReader from, TextWriter to)
var doc = XDocument.Load(from);
foreach (var node in doc.Descendants("PREMout"))
node.Elements("PremFromDate").ToList(),
node.Elements("PremToDate").ToList(),
node.Elements("AnnualPremium").ToList(),
node.Elements("ModePremium").ToList(),
if (!lists.Skip(1).All(l => l.Count == lists[0].Count))
throw new InvalidOperationException("Unequal list counts");
foreach (var nodes in lists.ZipMany(l => l))
node.Add(new XElement("PREMoutData", nodes));
public static class EnumerableExtensions
public static IEnumerable<TResult> ZipMany<TSource, TResult>(
this IEnumerable<IEnumerable<TSource>> source,
Func<IEnumerable<TSource>, TResult> selector)
var enumerators = source.Select(seq => seq.GetEnumerator()).ToList();
foreach (var e in enumerators)
yield return selector(enumerators.Select(e => e.Current).ToList());
foreach (var e in enumerators)
public static string GetXml()
<PolicyNumber>12345</PolicyNumber>
<PremFromDate>11/10/2015</PremFromDate>
<PremToDate>12/12/2020</PremToDate>
<AnnualPremium>400.00</AnnualPremium>
<ModePremium>400.00</ModePremium>
<PremFromDate>12/31/2020</PremFromDate>
<PremToDate>12/12/2027</PremToDate>
<AnnualPremium>5000.00</AnnualPremium>
<ModePremium>5000.00</ModePremium>
public static void Test()
ConsoleAndDebug.WriteLine("Original XML: ");
ConsoleAndDebug.WriteLine(XDocument.Parse(GetXml()));
ConsoleAndDebug.WriteLine("Reordered XML:");
Test(XmlPremOutHelper.ReorderPremiumElements);
ConsoleAndDebug.WriteLine("Restructured XML:");
Test(XmlPremOutHelper.GroupPremiumElements);
public static void Test(Action<TextReader, TextWriter> action)
var xmlString = GetXml();
using (var reader = new StringReader(xmlString))
using (var writer = new StringWriter())
ConsoleAndDebug.WriteLine(writer);
public static class ConsoleAndDebug
public static void WriteLine(object s)
public static void Main()