2014-12-29 62 views
0

我在使用c#应用程序时遇到了一些麻烦。它只能够获得第一个节点的属性,然后它不能获得以下节点的属性。未检测到xml属性

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

+0

除非您的XML很大(即大于25 Mb),否则最好使用DOM方法,如XmlDocument和SelectNodes用于此类操作。 –

+0

我想你想要'reader.MoveToNextAttribute()',然后检查名称以查看它是否为'ITEM'。如果是,那么你可以调用'reader.Value'来获取它。尽管如此,我可能只是将XML序列化与一些POCO一起使用,而不是与XML Reader一起作战。 PITA可能是相当发展的。 – TyCobb

+0

我编辑了你的标题。请参阅,“[应该问题包括在他们的标题”标签“?](http://meta.stackexchange.com/questions/19190/)“,其中的共识是”不,他们不应该“ –

回答

1

您不检查读者是否在元素的开头。您的代码因为试图根据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 becareful。为了使XmlReader能够工作到某一点,XML不一定必须是有效的。它只会在出现问题时抛出错误,并且您可能已经在该点处理过数百个节点。

+0

@FearghalConn我通过将鼠标移动到'reader'上来检查值在每个'Read()'之后,它说“EndElement”,调试器是你的朋友;) – TyCobb