using System.Collections.Generic;
using System.Xml.Serialization;
using System.Globalization;
using System.Collections;
public static class XmlReaderExtensions
public static IEnumerable<IEnumerable<XElement>> ReadNestedElements(this XmlReader xmlReader, string outerName, string innerName)
if (xmlReader.NodeType == System.Xml.XmlNodeType.Element && xmlReader.Name == outerName)
using (var subReader = xmlReader.ReadSubtree())
yield return subReader.ReadElements(innerName);
public static IEnumerable<XElement> ReadElements(this XmlReader xmlReader, string name)
if (xmlReader.NodeType == System.Xml.XmlNodeType.Element && xmlReader.Name == name)
var element = (XElement)XNode.ReadFrom(xmlReader);
public static void Test()
Console.WriteLine("\nAll tests passed.");
public static void Test(string xmlString)
Console.WriteLine("\nTesting XML: ");
Console.WriteLine(xmlString);
var indentedXml = XElement.Parse(xmlString).ToString(SaveOptions.None);
var unindentedXml = XElement.Parse(xmlString).ToString(SaveOptions.None);
var indentedValues = LastFieldValues(indentedXml);
var unindentedValues = LastFieldValues(unindentedXml);
Console.WriteLine("Indented last field values: ");
Console.WriteLine(String.Join(",", indentedValues));
Console.WriteLine("Unindented last field values: ");
Console.WriteLine(String.Join(",", unindentedValues));
var doc = XDocument.Parse(xmlString);
var xpathLastValues = doc
.XPathSelectElements(@"//fields/field/value[last()]")
Console.WriteLine("Last field values from XPathSelectElements(): ");
Console.WriteLine(String.Join(",", xpathLastValues));
Assert.IsTrue(indentedValues.SequenceEqual(unindentedValues));
Assert.IsTrue(xpathLastValues.SequenceEqual(unindentedValues));
static List<string> LastFieldValues(string xml)
using (var textReader = new StringReader(xml))
using (var xmlReader = XmlReader.Create(textReader))
return LastFieldValues(xmlReader);
public static List<string> LastFieldValues(XmlReader reader)
var query = reader.ReadNestedElements("field", "value")
.Select(l => l.LastOrDefault())
<field fieldid=""fdtElem3Group"">
<value actionid=""1"" actiontype=""review"">123456789</value>
<value actionid=""2"" actiontype=""review"">123456789</value>
<value actionid=""3"" actiontype=""review"">123456789</value>
<value actionid=""4"" actiontype=""review"">123456789</value>
<value actionid=""5"" actiontype=""review"">123456789</value>
<field fieldid=""fdtElem7Group"">
<value actionid=""1"" actiontype=""review"">29/10/75</value>
<value actionid=""2"" actiontype=""review"">29/10/74</value>
<value actionid=""3"" actiontype=""review"">29/10/74</value>
<value actionid=""4"" actiontype=""review"">29/10/76</value>
<value actionid=""5"" actiontype=""review"">29/10/74</value>
<field fieldid=""fdtElemNullGroup"" />
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static class Assert
public static void IsTrue(bool value)
public static void IsTrue(bool value, string message)
throw new AssertionFailedException(message ?? "failed");
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);