Как проверить наличие нулевых атрибутов в выражениях LinqToXML? - PullRequest
3 голосов
/ 08 августа 2011

У меня есть выражение 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 голосов
/ 08 августа 2011

Вместо использования свойства 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?, учтите ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...