未检测到 XML 属性

本文关键字:属性 XML 检测 | 更新日期: 2023-09-27 18:35:40

我的 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);
                }
            }

谁能建议为什么第一个之后的产品作为 id 变为空?

未检测到 XML 属性

您没有检查读取器是否位于元素的开头。您的代码正在爆炸,因为它试图基于 PRODUCT 的结束元素进行处理。

将此检查添加到检查"PRODUCT"的 if 语句之后。

if (reader.Name.Equals("PRODUCT"))
{
    if (!reader.IsStartElement())
        continue;
    // Your normal processing code here.
}

这就是使用XmlReader有些痛苦的原因。它遍历每个元素,这意味着您需要注意它可能在哪里。第一次通过,它是在开始元素。你处理,一切都很好,但随后它到达了仍然名为"PRODUCT"</PRODUCT>元素,这就是它分崩离析的地方。

以下是基于您向前移动reader的代码的顺序。

  • reader.Read()移动到第一个元素:ALLPRODUCTS
  • 不是您要查找的内容,因此再次reader.Read(),它找到节点类型Whitespace,因为没有内部文本。
  • reader.Read()搬到了PRODUCT
  • 你得到一个属性,然后告诉它读给QUANTITY。(请注意,您无法返回。订单事项)
  • reader.Read()移动到下一个元素PRODUCT。这不是<PRODUCT>.这是</PRODUCT>.
  • 您的代码现在再次开始上述大部分过程,但由于它不在<PRODUCT>

编辑:还要小心XmlReader。XML 不一定必须有效才能使XmlReader工作到某个点。它只会在遇到问题时抛出错误,此时您可能已经处理了数百个节点。