Linq / XML - 如何处理非现有节点?

时间:2011-03-12 21:06:01

标签: c# xml linq linq-to-xml

我试图弄清楚如何处理所有“卡”元素都不存在的节点。我有以下linq查询:

    FinalDeck = (from deck in xmlDoc.Root.Element("Cards")
                    .Elements("Card")
                    select new CardDeck
                    {
                        Name = deck.Attribute("name").Value,
                        Image = deck.Element("Image").Attribute("path").Value,
                        Usage = (int)deck.Element("Usage"),
                        Type = deck.Element("Type").Value,
                        Strength = (int)deck.Element("Ability") ?? 0
                    }).ToList();  

有了Strength项目,我读过另一篇帖子了?处理null。我收到以下错误:

运营商'??'不能应用于'int'和'int'

类型的操作数

我该如何处理这个问题?

谢谢!

1 个答案:

答案 0 :(得分:4)

而不是使用Value属性,转换为string ...而不是int,而是转换为int?。如果源XAttribute / XElement为空,则用户定义的转换为可空类型将返回null:

FinalDeck = (from deck in xmlDoc.Root.Element("Cards")
                .Elements("Card")
                select new CardDeck
                {
                    Name = (string) deck.Attribute("name"),
                    Image = (string) deck.Element("Image").Attribute("path"),
                    Usage = (int?) deck.Element("Usage"),
                    Type = (string) deck.Element("Type"),
                    Strength = (int?) deck.Element("Ability") ?? 0
                }).ToList();  

请注意,对于缺少Image元素的情况,此不会帮助,因为它会尝试取消引用null元素以查找path属性。如果你想要一个解决方法,让我知道,但相对而言,这将是一个痛苦。

编辑:你总是可以自己创建一个扩展方法:

public static XAttribute NullSafeAttribute(this XElement element, XName name)
{
    return element == null ? null : element.Attribute(name);
}

然后这样称呼:

Image = (string) deck.Element("Image").NullSafeAttribute("path"),