未检测到xml属性

时间:2014-12-29 22:46:54

标签: c# xml xmlreader

我的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?

1 个答案:

答案 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并不一定必须有效。它只会在遇到问题时抛出错误,并且您可能已经处理了数百个节点。