2014-01-20 109 views
0

我正在使用recipe API構建Windows Phone 8應用程序,API以XML形式返回數據,至此我沒有解析API響應的許多問題,但是在製作完成後搜索配方,然後用戶應能夠點擊特定的搜索結果並查看該配方的更多信息,這是一個帶三個標頭的透視頁面:在C中解析XML的問題#

  • 詳細信息(其中包含配方名稱,圖片和說明)
  • 成分(很明顯,組分和數量列表)
  • 說明(包含準備和烹飪說明)

我沒有問題,得到的詳細信息和說明頁面中的元素,因爲只有每一個由API返回的XML這些元素中的一個,但是與成分,每種成分已在自己的段xml,所以我認爲代碼中的foreach循環能夠將所有的細節放入列表中,但是,當運行應用程序並導航到此頁面時,應用程序似乎會加載所有信息的倍數,包括詳情和說明頁面。

因此,現在有許多相同的圖像,標題和解密顯示在詳細信息頁面上,在說明頁面上有很多相同的說明以及成分頁面上有大量相同的成分。我不太清楚如何解決這個問題,因爲我嘗試的所有東西都不起作用。

從下面的代碼中刪除foreach循環會阻止應用程序加載相同信息的負載,但顯然沒有任何成分,請參閱下面的代碼,我無法發佈API鏈接,因爲對於我可以每小時製作很多請求,並在此處插入它以不明確的方式進行格式化,有誰知道有任何步驟可以嘗試解決此問題嗎?

代碼:

void bigOvenRecipe_RecipeDetailsCompleted(object sender, DownloadStringCompletedEventArgs e) 
{ 
    var xdoc = XDocument.Parse(e.Result); 
    Details content = new Details(); 
    List<Details> contentList = new List<Details>(); 

    try 
    { 
     content.RecipeImage = xdoc.Root.Element("ImageURL").Value; 
     content.Title = xdoc.Root.Element("Title").Value; 
     content.Description = xdoc.Root.Element("Description").Value; 
     content.Instructions = xdoc.Root.Element("Instructions").Value; 
     contentList.Add(content); 

     foreach (XElement item in xdoc.Elements("Recipe").Elements("Ingredients").Elements("Ingredient")) 
     { 
      content.IngredientName = item.Element("Name").Value; 
      content.IngredientQuantity = item.Element("Quantity").Value; 
      content.IngredientUnit = item.Element("Unit").Value; 
      contentList.Add(content); 
     } 
    } 

    catch (Exception error) 
    { 
     MessageBox.Show("An error was encountered while performing this request: " + error.Message); 
    } 

    detailsList.ItemsSource = contentList.ToList(); 
    ingredientsList.ItemsSource = contentList.ToList(); 
    instructionsList.ItemsSource = contentList.ToList(); 
} 

預先感謝您!

+0

您能否提供輸入XML以便我們擁有SSCCCE? http://sscce.org/ –

回答

0

我看到的一個突出問題是,您不斷向contentList添加相同的content對象。

我猜測Details是引用類型,並content是僅向一個Details對象的引用。

您的整個contentList只是一堆對同一對象的引用。

嘗試實例化每種成分的新對象。

foreach (XElement item in xdoc.Elements("Recipe").Elements("Ingredients").Elements("Ingredient")) 
{ 

    Details content = new Details(); 
    // initialize other values 
    content.IngredientName = item.Element("Name").Value; 
    content.IngredientQuantity = item.Element("Quantity").Value; 
    content.IngredientUnit = item.Element("Unit").Value; 
    contentList.Add(content); 
}