Я использую XMLReader в C# для получения данных из XML-документа, полученного как часть веб-запроса. XML создается на основе параметров запроса, переданных службе, и может включать в себя множество элементов. Пример в этом вопросе основан на запросе инвентаризации.XMLReader.ReadToNextSibling перескакивает до конца файла
Вот урезанная версия 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">
<QMXINVQ_INVENTORYType>
<ABCTYPE>C</ABCTYPE>
<BINNUM>A-5-2</BINNUM>
<FREQUNIT />
<GLACCOUNT>
<VALUE>????-???-200</VALUE>
<GLCOMP
glorder="2">200</GLCOMP>
</GLACCOUNT>
<INVENTORYID>140</INVENTORYID>
<INVGENTYPE />
<ISSUEUNIT>EACH</ISSUEUNIT>
<VENDOR>ATI</VENDOR>
<INVBALANCES>
<BINNUM>A-5-2</BINNUM>
<CURBAL>6</CURBAL>
<STAGEDCURBAL>0</STAGEDCURBAL>
<STAGINGBIN>false</STAGINGBIN>
</INVBALANCES>
<ITEM>
<DESCRIPTION>Connecting Link - Repair</DESCRIPTION>
<EXTERNALREFID />
<GROUPNAME />
<ISSUEUNIT />
<ITEMID>175</ITEMID>
<ITEMTYPE>ITEM</ITEMTYPE>
<LOTTYPE
maxvalue="NOLOT">NOLOT</LOTTYPE>
</ITEM>
</QMXINVQ_INVENTORYType>
<QMXINVQ_INVENTORYType>
<ABCTYPE>C</ABCTYPE>
<BINNUM>B-8-1</BINNUM>
<FREQUNIT />
<GLACCOUNT>
<VALUE>????-???-300</VALUE>
<GLCOMP
glorder="2">300</GLCOMP>
</GLACCOUNT>
<INVENTORYID>142</INVENTORYID>
<INVGENTYPE />
<ISSUEUNIT>EACH</ISSUEUNIT>
<VENDOR>ATI</VENDOR>
<INVBALANCES>
<BINNUM>B-8-1</BINNUM>
<CURBAL>5</CURBAL>
<STAGEDCURBAL>0</STAGEDCURBAL>
<STAGINGBIN>false</STAGINGBIN>
</INVBALANCES>
<ITEM>
<DESCRIPTION>Fence Stretcher</DESCRIPTION>
<EXTERNALREFID />
<GROUPNAME />
<ISSUEUNIT />
<ITEMID>105</ITEMID>
<ITEMTYPE>ITEM</ITEMTYPE>
<LOTTYPE
maxvalue="NOLOT">NOLOT</LOTTYPE>
</ITEM>
</QMXINVQ_INVENTORYType>
Вот код блока в вопросе:
XmlTextReader reader = new XmlTextReader(strRespFile);
reader.MoveToContent();
string topLevelElementName = reader.Name;
// We need to advance "i" rows here.
for (int k = 0; k < i; k++)
{
reader.ReadToNextSibling(topLevelElementName);
}
// Now, read the element's value for the column
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == c)
{
reader.Read();
dr[c] = reader.Value;
break;
}
}
}
reader.Close();
код верхнего уровня (не показан), считывает дочерние элементы для данных. Если встречается дочерний элемент, выполняется код. Подчиненные первого дочернего элемента найдены и успешно добавлены в datatable.
<INVBALANCES>
<CURBAL>6</CURBAL>
...
<ITEM>
<DESCRIPTION>Connecting Link - Repair</DESCRIPTION>
Последующие исполнения приводят к тому, что читатель прыгает прямо в конец файла. Любые идеи о том, почему он собирается EOF вместо чтения следующего ребенка?