Linq / XML - Как вы обрабатываете несуществующие узлы? - PullRequest
3 голосов
/ 13 марта 2011

Я пытаюсь выяснить, как обрабатывать узлы, которые не существуют для всех моих «карточных» элементов. У меня есть следующий запрос 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();  

с предметом Силы, я прочитал еще одну публикацию, что ?? обрабатывает ноль. Я получаю следующую ошибку:

Оператор '??' не может применяться к операндам типа 'int' и 'int'

Как мне решить эту проблему?

Спасибо!

1 Ответ

4 голосов
/ 13 марта 2011

Вместо использования свойства Value приведите к string ... и вместо int приведите к int?.Определенные пользователем преобразования в обнуляемые типы будут возвращать нуль, если источник XAttribute / XElement равен нулю:

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 отсутствует, так как тогда он попытается разыменовать нулевой элемент, чтобы найти атрибут path.Дайте мне знать, если вы хотите обойти это, но это будет немного сложнее, условно говоря.

РЕДАКТИРОВАТЬ: Вы всегда можете создать метод расширения для этого самостоятельно:

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

Тогда назовите это так:

Image = (string) deck.Element("Image").NullSafeAttribute("path"),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...