2014-12-29 60 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