2010-04-27 6 views
2

J'ai un morceau source de xml dans lequel je veux insérer plusieurs éléments qui sont créés dépend de certaines valeurs trouvées dans le fichier XMLInsérer des XElements à l'aide de LINQ Select?

originale À l'heure actuelle, j'ai un sous qui le fait pour moi:

<Extension()> 
Public Sub AddElements(ByVal xml As XElement, ByVal elementList As IEnumerable(Of XElement)) 

    For Each e In elementList 
     xml.Add(e) 
    Next 

End Sub 

Et cela s'invoqué dans une routine comme suit:

Dim myElement = New XElement("NewElements") 

myElement.AddElements(
    xml.Descendants("TheElements"). 
    Where(Function(e) e.Attribute("FilterElement") IsNot Nothing). 
    Select(Function(e) New XElement("NewElement", New XAttribute("Text", e.Attribute("FilterElement").Value)))) 

est-il possible de ré-écrire ce en utilisant la syntaxe LINQ donc je ne ai pas besoin d'appeler les sous AddElements, mais ne pouvait tout en -line

Beaucoup Thx

Simon

Répondre

2

Bien sûr:

Dim outputxml = 
    New XElement("NewElements", 
     xml.Descendants("TheElements"). 
     Where(Function(e) e.Attribute("FilterElement") IsNot Nothing). 
     Select(Function(e) _ 
     New XElement("NewElement", 
      New XAttribute("Text",e.Attribute("FilterElement").Value) 
     ) 
    ) 
    ) 

XElement et XAttribute ont des constructeurs qui (en plus de l'élément ou nom d'attribut) acceptent un nombre arbitraire d'objets (qui peuvent eux-mêmes être des requêtes ou autre IEnumerables). Tout ce que vous transmettez au constructeur est ajouté en tant que contenu.

Vous pouvez également vous intéresser aux littéraux XML, ce qui les rend beaucoup plus lisibles mais font essentiellement la même chose.

Avec XML Literals, il ressemble à ceci:

dim outputxml = 
    <NewElements><%= 
     From e In xml...<TheElements> 
     Where [email protected] IsNot Nothing 
     Select <NewElement Text=<%= [email protected] %>/> 
    %></NewElements> 
' you can embed names and attribute values too 
  • <%=%> embarque la valeur d'expression VB en XML
  • xml...<elemname> sélectionne les descendants de xml appelés elemName
  • « élém @ attrname` obtient. la valeur d'un attribut

C'est presque XQuery ;-).

+0

Excellent ... beaucoup thx (et rapide!) –

+0

oui ... que - littéraux xml - est beaucoup plus agréable! Thx encore –

+0

littéraux xml .... quelle chose chouette les programmeurs C# ne peuvent pas avoir :( – slf