在C#中解析XML的问题

时间:2014-01-20 19:48:33

标签: c# xml windows-phone-8

我正在使用配方API构建Windows Phone 8应用程序,API以XML格式返回数据,到目前为止,我在解析API响应方面没有遇到太多问题,但在搜索配方后,然后,用户应该可以点击特定的搜索结果并查看有关该配方的更多信息,这是一个包含三个标题的Pivot页面:

  • 详情(包含食谱名称,图像和说明)
  • 成分(显然列出成分和数量)
  • 说明(包含准备和烹饪说明)

获取详细信息和说明页面的元素没有问题,因为API返回的xml中只有一个元素,但是使用Ingredients,每个成分在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();
}

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我看到的一个明显问题是您不断向content添加相同的contentList对象。

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