using System.Collections.Generic;
using System.Xml.Serialization;
using System.Diagnostics;
public static string GetXml()
string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<ArrayOfQMXINVQ_INVENTORYType xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
<VALUE>????-???-200</VALUE>
glorder=""2"">200</GLCOMP>
<INVENTORYID>140</INVENTORYID>
<ISSUEUNIT>EACH</ISSUEUNIT>
<STAGEDCURBAL>0</STAGEDCURBAL>
<STAGINGBIN>false</STAGINGBIN>
<DESCRIPTION>Connecting Link - Repair</DESCRIPTION>
<ITEMTYPE>ITEM</ITEMTYPE>
maxvalue=""NOLOT"">NOLOT</LOTTYPE>
<VALUE>????-???-300</VALUE>
glorder=""2"">300</GLCOMP>
<INVENTORYID>142</INVENTORYID>
<ISSUEUNIT>EACH</ISSUEUNIT>
<STAGEDCURBAL>0</STAGEDCURBAL>
<STAGINGBIN>false</STAGINGBIN>
<DESCRIPTION>Fence Stretcher</DESCRIPTION>
<ITEMTYPE>ITEM</ITEMTYPE>
maxvalue=""NOLOT"">NOLOT</LOTTYPE>
</ArrayOfQMXINVQ_INVENTORYType>";
public static void Test()
int topLevelElementIndex = 1;
var topLevelElementName = "QMXINVQ_INVENTORYType";
using (var sr = new StringReader(xml))
using (var reader = XmlReader.Create(sr))
Debug.Assert(reader.Name == "ArrayOfQMXINVQ_INVENTORYType");
if (reader.Name != topLevelElementName)
if (!reader.ReadToNextSibling(topLevelElementName))
throw new InvalidOperationException("Not enough elements named " + topLevelElementName);
for (int i = topLevelElementIndex; i > 0; i--)
if (!reader.ReadToNextSibling(topLevelElementName))
throw new InvalidOperationException("Not enough elements named " + topLevelElementName);
Debug.Assert(reader.NodeType == XmlNodeType.Element && reader.Name == topLevelElementName);
using (var subReader = reader.ReadSubtree())
var element = XElement.Load(subReader);
if (element.Descendants("BINNUM").Select(e => (string)e).FirstOrDefault() != "B-8-1")
Debug.Assert(element.Descendants("BINNUM").Select(e => (string)e).FirstOrDefault() == "B-8-1");
throw new InvalidOperationException();
Console.WriteLine(element.ToString());
public static void Main()