【发布时间】:2015-07-17 17:31:11
【问题描述】:
我在 C# 中使用 XMLReader 从作为 Web 请求的一部分接收的 XML 文档中获取数据。 XML 是根据传递给服务的查询参数生成的,并且可以包含无数元素。此问题中的示例基于库存查询。
这是 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();
顶层代码(未显示)将子元素读取到数据表中。如果遇到子子项,则执行包含的代码。找到第一个子元素的子元素并成功添加到数据表中。
<INVBALANCES>
<CURBAL>6</CURBAL>
...
<ITEM>
<DESCRIPTION>Connecting Link - Repair</DESCRIPTION>
随后的执行会导致阅读器直接跳到文件的末尾。关于为什么要使用 EOF 而不是阅读下一个孩子的任何想法?
【问题讨论】: