0

为什么这样工作:

        XDocument dataFeed = XDocument.Parse(e.Result);
        var guide = from query in dataFeed.Descendants("MaxPayne3")
                                    select new NewGamesClass
                                    {
                                        GameID = (string)query.Element("ID"),
                                        GameTitle = (string)query.Element("Title"),
                                        GameDescription = (string)query.Element("Description"),
                                        GameGuide = (string)query.Element("Guide")
                                    };

        if (NavigationContext.QueryString.TryGetValue("selectedItem", out selectedIndex))
        {
            if (selectedIndex == "0")
                GuidesListBox.ItemsSource = guide.Where(ngc => ngc.GameTitle.StartsWith("Feel"));
            else if (selectedIndex == "1")
                GuidesListBox.ItemsSource = guide.Where(ngc => ngc.GameTitle.StartsWith("Serious"));

但不是这样:

            if (selectedIndex == "0")
                GuidesListBox.ItemsSource = guide.Where(ngc => ngc.GameID.StartsWith("000"));
            else if (selectedIndex == "1")
                GuidesListBox.ItemsSource = guide.Where(ngc => ngc.GameID.StartsWith("001"));

我想使用 GameID 而不是 GameTitle。

抱歉没有 XML,对我来说太早了,哈哈

这里: https ://dl.dropbox.com/u/27136243/AchivementHunters/XML/GameList.xml

这是课程:

public class NewGamesClass
{
    string gameID;
    string gameTitle;
    string gamedescription;
    string gameImage;
    string gameGuide;
    string videoLink;
    public string GameID
    { get { return gameID; } set { gameID = value; } }
    public string GameTitle
    { get { return gameTitle; } set { gameTitle = value; } }
    public string GameDescription
    { get { return gamedescription; } set { gamedescription = value; } }
    public string GameImage
    { get { return gameImage; } set { gameImage = value; } }
    public string GameGuide
    { get { return gameGuide; } set { gameGuide = value; } }
    public string VideoLink
    { get { return videoLink; } set { videoLink = value; } }
}
4

2 回答 2

2

大多数<MaxPayne3>节点没有子<ID>节点,因此这段代码:

select new NewGamesClass
           {
               GameID = (string)query.Element("ID"),
               GameTitle = (string)query.Element("Title"),
               GameDescription = (string)query.Element("Description"),
               GameGuide = (string)query.Element("Guide")
            }

将为GameID. 然后这段代码:

guide.Where(ngc => ngc.GameID.StartsWith("000"))

将抛出NullReferenceException所有这些元素

将其更改为:

guide.Where(ngc => !String.IsNullOrEmpty(ngc.GameID) && ngc.GameID.StartsWith("000"))

它应该可以正常工作。

于 2012-07-18T10:38:24.080 回答
0

鉴于我们没有数据,这里唯一显着的区别是.GameTitle.vs .GameID.。我假设“不起作用”在这里意味着“它会引发异常”。我可以预测的主要例外是NullReferenceException, because .GameIDis null, so.GameID.anything是非法的。

这让我认为它<ID>whatever</ID>在您认为存在的位置不存在(这将导致.GameID成为null参考)。要验证的事项:

  • 它存在于那里
  • 大小写正确(ID, Id, id, 等)
  • 那是一个元素,而不是一个属性
  • 它不在命名空间中

更新:这是数据中的问题:

<MaxPayne3>
  <Title>Part I Complete - 20G</Title>
  <Description>Complete Part I Of The Story</Description>
  <Guide>Story related, cannot be missed.</Guide>
  <Image>http://www.xbox360achievements.org/images/achievements/925/-K6lMA==.jpg</Image>
  <VideoLink/>
</MaxPayne3>

没有<ID>。像这样的还有很多。所以:你需要处理它。一个务实的检查将是:

...blah...guide.Where(ngc => ngc.GameID != null && ngc.GameID.StartsWith("000"));
于 2012-07-18T10:30:44.817 回答