Как обработать отсутствующий узел в запросе LINQ to XML - PullRequest
2 голосов
/ 07 июля 2011

В следующем примере показано, как установить значение по умолчанию для запроса LINQ to XML при отсутствии данных:

IEnumerable<Person> persons =
from e in x.Descendants("Person")
select new Person { 
    Name = e.Value,
    Age = (int?)e.Attribute("Age") ?? 21
};

Но как вы справляетесь, когда атрибут вообще отсутствует? Например, что если узел не имеет родительского узла?

IEnumerable<Person> persons =
    from e in x.Descendants("Person")
    select new Person { 
        Name = e.Value,
        Age = (int?)e.Attribute("Age") ?? 21
        ParentAge = e.Parent.Attribute("Age")
    };

Ответы [ 2 ]

3 голосов
/ 07 июля 2011

Вы справляетесь с этим нелегко, обычно с помощью троичного условного оператора :

IEnumerable<Person> persons =
    from e in x.Descendants("Person")
    select new Person { 
        Name = e.Value,
        Age = (int?) e.Attribute("Age") ?? 21,
        ParentAge = e.Parent != null ? (int) e.Parent.Attribute("Age") : 42
    };

Насколько мне известно, в C # нет более короткого способа сделать это.

0 голосов
/ 03 апреля 2013

В моем случае мне пришлось проверить, существует ли узел «Примечания» или нет, и обработать оба случая, а также любые апострофы в текстовых строках (этот код используется для создания строк вставки MySQL).Я заключаю строку, если она существует в одинарных кавычках, и заменяю апострофы на удвоенные, или просто вставляю NULL, если узел не существует.Я не имею никакого контроля над XML-клиентом, который создает XML-файлы, и у меня есть буквально десятки тысяч из них, чтобы проанализировать их, так что вот что я придумала, это работает:

var items =
    from e in creationItems
    select new
    {
        //other values
        Notes = e.Descendants("Notes").Any() ? "'" + e.Descendants("Notes").First().Value.Replace("'", "''") + "'" : "NULL"
    };

Я не могвыясните, как правильно добавить это как комментарий, так что это всего лишь дополнение к отличному ответу @ Frédéric Hamidi.Это может быть полезно для других людей в моем затруднительном положении.Это значительно уменьшает мой код разбора, поэтому это отличное решение.

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