2009-11-13 7 views
4

J'ai essayé d'effectuer une recherche sur ce sujet, mais je n'arrive pas à trouver une réponse, alors j'espère que quelqu'un ici pourra vous aider. Je veux insérer une balise XML conditionnelle selon que le nombre est supérieur ou égal à un, mais je ne suis pas sûr de savoir comment le faire.Littéral XML conditionnel

Par exemple, j'ai deux XElements qui sont comme ceci:

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

et

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

Je veux que ça finisse par être pour la première:

<BigGroup> 
<Group/> 
</BigGroup> 

et pour le second:

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

Remarquez dans le second, leur étiquette est enroulée autour des deux groupes. Donc, je veux cette condition dans le XML Literal. Ce que j'ai essayé est:

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

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

Mais cela ne fonctionne pas. Est-ce que quelqu'un a un moyen de le faire à partir de XML Literal comme souhaité ci-dessus?

+0

Qu'est-ce que cela signifie "ne fonctionne pas"? Qu'obtenez-vous exactement? – Konamiman

+0

Je reçois:

Répondre

11

Vous pouvez simplement placer l'instruction If dans le littéral XML. En outre, il est assez intelligent pour produire un IEnumerable(Of XElement) en faisant simplement référence à la variable à l'intérieur de <%= %>.

Voici le 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 

La sortie est:

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

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

WOW! C'est exactement ce que je cherchais. Merci beaucoup! –