如何在LinqToXML表达式中检查空属性?

时间:2011-08-08 16:02:49

标签: linq linq-to-xml

我有一个LinqToXML表达式,我试图根据相似的属性选择不同的名称。代码工作得很好,我把它放在下面:

            var q = xmlDoc.Element("AscentCaptureSetup").Element("FieldTypes")
            .Descendants("FieldType")
            .Select(c => new { width = c.Attribute("Width").Value,
                                script = c.Attribute("ScriptName").Value,
                                sqlType = c.Attribute("SqlType").Value,
                                enableValues = c.Attribute("EnableValues").Value,
                                scale = c.Attribute("Scale").Value,
                                forceMatch = c.Attribute("ForceMatch").Value,
                                forceMatchCaseSensitive = c.Attribute("ForceMatchCaseSensitive").Value,
                                sortAlphabetically = c.Attribute("SortAlphabetically").Value,
                            })
            .Distinct();

问题出现了,因为并非所有属性都是必需的,如果省略其中一个属性,例如 sortAlphabetically ,我会得到一个Object not Referenced错误。有道理,但有一种方法可以改变查询,只有在属性实际存在时才使用新值? (从而绕过任何空指针错误)

1 个答案:

答案 0 :(得分:5)

不是使用Value属性(会在空引用上爆炸),只需将XAttribute强制转换为字符串 - 您将 获取值,如果XAttribute引用为null,则为空引用。 (XElement的工作方式相同,这适用于所有可转换为可空类型的转换。)

所以你有:

.Select(c => new { 
     width = (string) c.Attribute("Width"),
     script = (string) c.Attribute("ScriptName"),
     sqlType = (string) c.Attribute("SqlType"),
     enableValues = (string) c.Attribute("EnableValues"),
     scale = (string) c.Attribute("Scale"),
     forceMatch = (string) c.Attribute("ForceMatch"),
     forceMatchCaseSensitive = (string) c.Attribute("ForceMatchCaseSensitive"),
     sortAlphabetically = (string) c.Attribute("SortAlphabetically"),
 })

其中一些属性听起来应该实际投射到int?bool?,请注意......