我的c#应用程序遇到了一些问题。它只能获取第一个节点的属性,然后无法获得以下节点的属性。
XML采用这种格式..
<ALLPRODUCTS>
<PRODUCT ITEM="1">
<QUANTITY>5</QUANTITY>
</PRODUCT>
<PRODUCT ITEM="2">
<QUANTITY>6</QUANTITY>
</PRODUCT>....
应用程序将第一个产品编号设为1,其数量为5 ......但之后只提供数量,并说项目编号为空。这是我使用的代码......
while (reader.Read())
{
if (reader.Name.Equals("PRODUCT"))
{
String id;
String qty;
try
{
id = reader.GetAttribute("ITEM");
reader.ReadToFollowing("QUANTITY");
qty = reader.ReadInnerXml();
if (qty.Equals("0"))
{
oos++;
}
else
{
inStock++;
}
status.Refresh();
stockLevelList.Add(id, qty);
}
catch (Exception e)
{
MessageBox.Show(e.Message, e.Source, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
有人可以建议为什么第一个产品之后的产品为null?
答案 0 :(得分:1)
您没有检查读者是否在元素的开头。您的代码正在爆炸,因为它正在尝试根据PRODUCT
的结束元素进行处理。
在if
语句之后添加此项检查,检查&#34; PRODUCT&#34;。
if (reader.Name.Equals("PRODUCT"))
{
if (!reader.IsStartElement())
continue;
// Your normal processing code here.
}
这使得使用XmlReader
有点痛苦。它遍历每一个元素,这意味着你需要注意它可能在哪里。第一次,它在Start Element。你进行处理并且一切都很好,但随后它会到达仍然命名为</PRODUCT>
的{{1}}元素以及它分崩离析的那个元素。
以下是基于您移动"PRODUCT"
转发代码的订单。
reader
移至第一个元素:reader.Read()
ALLPRODUCTS
,而是找到节点类型reader.Read()
,因为没有内部文字。Whitespace
已移至reader.Read()
PRODUCT
。 (注意你不能回去。订单很重要)QUANTITY
移至下一个元素reader.Read()
。这不是PRODUCT
。它是<PRODUCT>
。</PRODUCT>
上而失败编辑:同样考虑<PRODUCT>
。为了使XmlReader
能够达到某一点,XML并不一定必须有效。它只会在遇到问题时抛出错误,并且您可能已经处理了数百个节点。