2010-01-28 11 views
3

Cet extrait est de ce answerLINQ to XML comment faire dans vb.net

var reports = from report in xml.Descendants("report") 
    where report.Element("name").Value.Contains("Adjustment Report") 
    select new { 
     Name = report.Element("name").Value, 
     Extension = report.Element("extension").Value, 
     FileType = report.Element("filetype").Value, 
     Fields = report.Elements("field") 
      .Select(f => new { 
       Name = f.Attribute("name").Value, 
       Type = f.Attribute("type").Value 
      }).ToArray() 
    }; 

Pour la vie de moi je ne peux pas comprendre la syntaxe de cette partie dans vb.net:

 Fields = report.Elements("field") 
      .Select(**f =>** new { 
       Name = f.Attribute("name").Value, 
       Type = f.Attribute("type").Value 
      }).ToArray() 

ce que je suis en train d'accomplir - mon xml ressemble à ceci:

<items> 
<item> 
    <id>data</id> 
    <foto> 
    <fotoname>img1.jpg</fotoname> 
    <fotoorder>1</fotoorder> 
    </foto> 
    <foto> 
    <fotoname>img2.jpg</fotoname> 
    <fotoorder>2</fotoorder> 
    </foto> 
</item> 
</items> 

je besoin de mon objet d'avoir une liste (ou d'une collection ny kind) des éléments foto.

Répondre

5

LINQ to XML est l'un des domaines où VB.NET offre une syntaxe complètement différente de C#. Vous pouvez utiliser la même méthode de chaînage, mais je préfère la syntaxe VB.NET LINQ qui ressemble à ceci:

Sub Main() 
    Dim myXml = <items> 
        <item> 
         <id>data</id> 
         <foto> 
          <fotoname>img1.jpg</fotoname> 
          <fotoorder>1</fotoorder> 
         </foto> 
         <foto> 
          <fotoname>img2.jpg</fotoname> 
          <fotoorder>2</fotoorder> 
         </foto> 
        </item> 
       </items> 

    Dim fotoElementsQuery = From f In myXml...<foto> _ 
          Select f 

    Dim fotoAnonymousTypeQuery = From f In myXml...<foto> _ 
           Select f.<fotoname>.Value, f.<fotoorder>.Value 

    Dim fotoNamedTypeQuery = From f In myXml...<foto> _ 
          Select New Foto With {.Name = f.<fotoname>.Value, .Order = f.<fotoorder>.Value} 

End Sub 

Public Class Foto 

    Private _name As String 
    Public Property Name() As String 
     Get 
      Return _name 
     End Get 
     Set(ByVal value As String) 
      _name = value 
     End Set 
    End Property 

    Private _order As Integer 
    Public Property Order() As Integer 
     Get 
      Return _order 
     End Get 
     Set(ByVal value As Integer) 
      _order = value 
     End Set 
    End Property 

End Class 

Cela vous donne 3 différents types de résultats IEnumerable.

  1. fotoElementsQuery sera de type IEnumerable(Of XElement)
  2. fotoAnonymousTypeQuery sera de type IEnumerable(Of <anonymous type>). Les éléments du type anonyme prendront les noms des éléments xml - fotoname et fotoorder.
  3. fotoNamedTypeQuery sera de type IEnumeragle(Of Foto)

Les requêtes LINQ n'ont pas fait encore exécuté dans le code ci-dessus. Pour obtenir une liste (et exécuter la requête), appelez la méthode d'extension .ToList() ou .ToArray(). La meilleure façon de découvrir LINQ (et LINQ to XML) dans VB.NET est de regarder la série How Do I Video de Beth Massi. http://msdn.microsoft.com/en-us/vbasic/bb466226.aspx#linq

+0

Vous dirigez l'homme. Avez-vous des liens qui expliquent cette syntaxe? Je ne l'ai jamais vu auparavant. – Vnuk

+0

Merci pour le lien, va vérifier. – Vnuk

+0

Avec les versions récentes de VB.NET, vous n'avez plus besoin des caractères de continuation de ligne de soulignement. – CoderDennis

0

Hah lu hier (si je ne me trompe pas - et je ne suis probablement pas à 100% sur toute la syntaxe ...)

Fields = report.Elements("field") 
    .Select(Function(f) new { 
     Name = f.Attribute("name").Value, 
     Type = f.Attribute("type").Value 
    }).ToArray() 

La clé bit - si ma mémoire fonctionne à droite - est changer "f =>" en "Fonction (f)"

+0

Je pense que vous avez raison mais je ne suis toujours pas là où je dois être. Je vais clarifier ma question. – Vnuk

5

Pour Concrétiser quelques-unes des autres réponses:

En VB.NET, vous pouvez utiliser XML opérateurs Axis pour simplifier la syntaxe de la méthode. Par exemple <root>..<child> est le même que XElement ("root"). Elements ("enfant"). Dans ce cas, l'enfant doit être directement sous la racine. Si vous souhaitez rechercher des nœuds indépendamment de leur emplacement dans les nœuds enfants, vous pouvez utiliser .Descendents au lieu de .Elements ou la syntaxe VB avec trois points comme suit: <root>...<descendentNodeName>. Si vous souhaitez accéder à un attribut, utilisez [email protected] comme suit: <root>[email protected].

De la réponse de Murph, vous pouvez ré-écrire en VB comme suit:

Fields = (From f In report.<field> _ 
      Select Name = [email protected], Type = [email protected]).ToArray() 

Cela peut aussi être écrit en utilisant la syntaxe Lambda comme suit:

Fields = report.<field> _ 
     .Select(Function(f) New With { _ 
      Name = [email protected], Type = [email protected]).ToArray() 
+0

Merci pour le fleashing, ça a été très utile – Vnuk