我有一个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错误。有道理,但有一种方法可以改变查询,只有在属性实际存在时才使用新值? (从而绕过任何空指针错误)
答案 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?
,请注意......