Условный XML-литерал - PullRequest
       21

Условный XML-литерал

5 голосов
/ 13 ноября 2009

Я пытался найти это, но, похоже, нигде не нашел ответа, так что, надеюсь, кто-то здесь может помочь Я хочу вставить условный тег XML в зависимости от того, является ли счет выше единицы, но я не уверен, как это сделать.

Например, у меня есть два XElement, которые выглядят так:

<Blob>
<Group>
Stuff 1
</Group>
</Blob>

и

<Blob>
<Group>
Stuff 1
</Group>
<Group>
Stuff 2
</Group>
</Blob>

Я хочу, чтобы это закончилось первым:

<BigGroup>
<Group/>
</BigGroup>

и для второго:

<BigGroup>
<Groups>
<Group/>
<Group/>
</Groups>
</BigGroup>

Обратите внимание на второй, это тег, обернутый вокруг двух групп.

Итак, я хочу это условие в XML Literal. Я попробовал:

Dim groups = If(<Blob>.<Group>.Count > 1, <Groups/>, Nothing)

Dim bigGroup = <BigGroup><%= groups %><%= from e in <Blob>.<Group> select e %><%= groups%></BigGroup>

Но это не работает. У кого-нибудь есть способ сделать это изнутри XML-литерала, как требуется выше?

1 Ответ

13 голосов
/ 14 ноября 2009

Вы можете просто разместить оператор If внутри XML Literal. Кроме того, он достаточно умен, чтобы вывести IEnumerable(Of XElement), просто ссылаясь на переменную внутри <%= %>.

Вот код.

Sub Main()
    Dim SingleGroup = <Blob>
                          <Group>Stuff 1</Group>
                      </Blob>

    Dim TwoGroups = <Blob>
                        <Group>Stuff 1</Group>
                        <Group>Stuff 2</Group>
                    </Blob>

    Dim BigGroup1 = BigGroup(SingleGroup.<Group>)

    Dim BigGroup2 = BigGroup(TwoGroups.<Group>)

    Console.WriteLine(BigGroup1)
    Console.WriteLine()

    Console.WriteLine(BigGroup2)
    Console.ReadLine()

End Sub

Function BigGroup(ByVal groups As IEnumerable(Of XElement)) As XElement
    Dim result = <BigGroup>
                     <%= If(groups.Count > 1, _
                         <Groups><%= groups %></Groups>, _
                         groups.SingleOrDefault) %>
                 </BigGroup>
    Return result
End Function

Вывод:

<BigGroup>
  <Group>Stuff 1</Group>
<BigGroup>

<BigGroup>
  <Groups>
    <Group>Stuff 1</Group>
    <Group>Stuff 2</Group>
  </Groups>
</BigGroup>
...