Reputation: 29155
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?
Upvotes: 5
Views: 2473
Reputation: 13837
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>
Upvotes: 14