2009-08-04 7 views
1
Dim names() As String = {"one", "two", "three"} 
Dim xml As XElement = Nothing 
For Each name In names 
    If xml Is Nothing Then 
    xml = New XElement(name) 
    Else 
    xml.Add(New XElement(name) 
    End If 
Next 

Le code ci-dessus va créer quelque chose comme ceci:LINQ to XML: comment ajouter des éléments enfants dans une boucle for-each?

<One> 
    <Two /> 
    <Three /> 
    </One> 

Ce que je besoin est quelque chose comme ceci:

<One> 
    <Two> 
     <Three /> 
    </Two> 
    </One> 

J'ai essayé d'utiliser xml.Elements.Last.Add(New XElement(name)), mais la méthode Last est pas nécessairement aussi le dernier élément pour une raison quelconque.

Merci!

Répondre

3

Un petit changement à votre code actuel va faire ce que vous voulez:

Dim names() As String = {"one", "two", "three"} 
Dim xml As XElement = Nothing 
For Each name In names 
    Dim new_elem As New XElement(name) 
    If xml IsNot Nothing Then 
     xml.Add(new_elem) 
    End If 
    xml = new_elem 
Next 

EDIT:

Vous pouvez introduire une autre variable pour stocker l'élément racine:

Function BuildTree() As XElement 
    Dim tree As XElement = Nothing 

    Dim names() As String = {"one", "two", "three"} 
    Dim xml As XElement = Nothing 
    For Each name In names 
     Dim new_elem As New XElement(name) 
     If tree Is Nothing Then 
      tree = new_elem 
     Else 
      xml.Add(new_elem) 
     End If 
     xml = new_elem 
    Next 

    Return tree 
End Function 
+0

I crois que c'est ce que je veux. Si ce code était dans une fonction, comment retournerais-je l'arbre entier que j'ai construit comme résultat si 'xml' finit par faire référence au dernier élément enfant? –

+0

Veuillez voir la réponse mise à jour: il suffit de stocker le premier élément créé dans une variable qui ne sera pas modifiée par la fonction –

0

On dirait que vous voulez juste add on an XElement - ne pas use.Last ou quoi que ce soit d'autre, en ajoutant après le dernier est le comportement par défaut ..

OIEau:

Vous pouvez dire:

Dim node1 as XElement = new XElement("A1") 
Dim node2 as XElement = new XElement("A2") 
Dim node3 as XElement = new XElement ("A3") 
node2.Add(node3) 
Dim root as XElement = new XElement("Root",new XElement(){node1,node2}) 

Pour:

<Root> 
    <A1 /> 
    <A2> 
    <A3 /> 
    </A2> 
</Root> 

Ou faire la même chose avec:

Dim node1 as XElement = new XElement("A1") 
Dim node2 as XElement = new XElement("A2") 
Dim node3 as XElement = new XElement ("A3") 
Dim root as XElement = new XElement("Root") 
Dim children as XElement() = new XElement(){node1,node2} 
for each child in children 
    root.add(child) 
    if child.Name = "A2" 
     child.Add(node3) 
    end if 
next 

Si vous cherchez le dernier nœud pour démarrer dans l'arbre (A3 dans l'exemple ci-dessus), vous voulez:

root.Descendants().Last() 

Est-ce que vous êtes vraiment après (lorsque vous demandez questions liek ceci, il est bon de donner un arbre et de dire quels nœuds vous voulez isoler)?

Questions connexes