Хороший способ сделать многоуровневый запрос "элемент" linq to xml без проверки на ноль - PullRequest
2 голосов
/ 01 марта 2010

Я работаю с фрагментом xml и обнаружил, что много делаю следующее:

dim x = xe.Element("foo").Element("bar").Element("Hello").Element("World").Value

однако я не всегда могу гарантировать, что документ xml будет содержать foo или bar. Есть ли лучший способ сделать это, не проверяя каждый запрос на ноль?

т.е.

dim x = ""
if xe.Element("foo").Any() then
    if xe.Element("foo").Element("bar").Any() Then
        if xe.Element("foo").Element("bar").Element("Hello").Any() Then
            x = xe.Element("foo").Element("bar").Element("Hello").Element("World").ValueOrDefault()
        End If
    End If
End If

(ValueOrDefault - метод расширения, который я добавил)

Ответы [ 2 ]

2 голосов
/ 01 марта 2010

По сути, вы перестали анализировать проблему.

Начните с этого:

xe.Elements("foo")

это вернет последовательность всех <foo> потомков xe; это может быть пустая последовательность, , но никогда не будет нулевой .

Теперь перейдем к следующему:

xe.Elements("foo")
    .Elements("bar")

При этом используется метод расширения Elements() (часть каркаса) для поиска всех <bar> дочерних элементов <foo> элементов, которые у вас есть.

Повторяйте это весь путь вниз, пока не найдете элемент со значением. Затем используйте приведение, чтобы извлечь значение:

dim x 
    = (string) xe.Elements("foo")
        .Elements("bar")
            .Elements("Hello")
                .Elements("World")
                    .FirstOrDefault()

Опять же, актерский состав предоставляется каркасом.

Вся проверка на null уже выполнена для вас умными программистами, написавшими фреймворк - это большая часть того, что делает XDocument и друзей, с которыми так приятно кодировать.

0 голосов
/ 01 марта 2010

может потребовать немного изменить метод расширения valueOrDefault. Основная идея:

xe.Elements("foo").Elements("bar").Elements("Hello").Elements("World").FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...