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

3

我有一个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,那么就会出现“对象未引用”的错误。这很有道理,但是否有一种方法可以修改查询,只有在属性实际存在时才分配新值?(从而绕过任何空指针错误)
1个回答

5

不要使用Value属性(当引用为空时会抛出异常),只需将XAttribute强制转换为字符串 - 您将获得值,或者如果XAttribute引用为空则获得空引用。 (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?,请注意...


糟糕!你已经喝了咖啡,而我没有。强制类型转换做得很好。至于转换类型是否重要,这些变量只会用于创建日志输出。感谢Jon。 - Mark Kadlec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接