未检测到 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 变为空?
您没有检查读取器是否位于元素的开头。您的代码正在爆炸,因为它试图基于 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
工作到某个点。它只会在遇到问题时抛出错误,此时您可能已经处理了数百个节点。