Conditional XML Literal

2.4k views Asked by At

I've tried searching on this but can't seem to find an answer anywhere, so hopefully someone here can help. I want to insert an conditional XML tag based on whether or not a count is above one, but am not sure how to do it.

For example, I have two XElements that are like this:

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

and

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

I want this to end up being for the first one:

<BigGroup>
<Group/>
</BigGroup>

and for the second one:

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

Notice in the second one, their is a tag of wrapped around the two groups.

So, I want that condition in the XML Literal. What I've tried is:

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

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

But that is not working. Does anyone have a way to do this from within the XML Literal as desired above?

1

There are 1 answers

0
CoderDennis On BEST ANSWER

You can just place the If statement inside the XML Literal. Also, it's smart enough to output an IEnumerable(Of XElement) by simply referencing the variable inside <%= %>.

Here's the code.

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

The output is:

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

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