8
votes

Linq à xml dans vb.net

Je suis essentiellement neuf sur Linq. J'ai beaucoup regardé ici et je suis assez confus. J'ai vu des exemples qui me permettent d'utiliser des objets de type fort à l'aide de Linq, mais je ne les comprends pas vraiment parce qu'ils sont en C #, ce que je suppose vous permet de faire des choses différentes avec Linq (je pense?).

De toute façon C'est ce que j'essaie de faire: xxx

edit - je veux juste obtenir une liste de tous les produits du document XML DOC et les mettre dans une liste de génériques.


3 commentaires

En fait, les moteurs de Linq sont similaires entre C # et VB; XML est l'un des rares domaines où il y a une différence, et c'est VB qui ajoute des choses, pas c # ;-p


Ok ... donc toute idée de l'aide avec / ce problème?


JSON à la recherche d'une aide XML ... c'est un peu drôle!


4 Réponses :


0
votes

OK, comment de cela? XXX


6 commentaires

Ce lien est pour la construction XML? Je ne cherche pas à construire xml ... je l'ai déjà fait ça. C'est pratiquement statique à ce statique. Je dois le lire et l'analyser dans des objets, puis dans une liste de génériques.


Comment obtenir "l'élément" pour être un "produit" comme le type de liste (du produit)?


Je reçois cette erreur sous "productxml" dans "à partir de l'élément de productXML Select item": l'expression de type system.xml.linq.xdocument n'est pas interrogée. Assurez-vous de ne pas manquer d'importation de référence et / ou d'espace de noms pour le fournisseur LINQ ... mais j'ai importé System.Linq ....


Eh bien, peut-être que vous n'avez pas besoin de la requête LINQ alors. -> Pour chaque produit en tant que produit en productexml ...


Merci ... Essayé: Pour chaque article en tant que produit en productXML, mais reçu l'erreur suivante: expression est de type system.xml.linq.xdocument, qui n'est pas un type de collection ... :(


Voir mon édition. Je pense que vous avez juste besoin d'extraire une collection d'éléments de documents du XDocument et de l'itérale à travers celles-ci.



11
votes

Marc a raison, VB vous permet de faire beaucoup de belles choses. Je suis un c # gars moi-même, mais je viens de frapper une solution VB pour voir comment le faire pour vous. J'ai posté le code ci-dessous et j'ai expliqué les parties clés. J'ai été très impressionné par les caractéristiques VB pour XML!

Je vois dans votre exemple d'échantillon que vous avez déjà réussi à charger votre XML dans un XDocument. Une fois que vous avez effectué votre xdocument.load, vous pouvez accéder au document XML en utilisant une syntaxe spéciale. P>

pour commencer, nous souhaitons obtenir tous les produits du document; I.e. Tous les éléments . Nous devons faire ce qui suit: p> xxx pré>

ceci dit que vous voulez tous les éléments du document. Cela nous donne une collection iénumérable de xelements. P>

Une fois que nous avons tiré un produit individuel de la collection, nous voudrons accéder aux valeurs du produit telles que le nom ou le prix du produit. Pour ce faire, nous devons faire ce qui suit: p> xxx pré>

Voici un exemple complet avec la sortie attendue pour que vous envisagez: p> xxx Pré>

La sortie du programme est la suivante: P>

Product name is Mountain Bike
Product price is 59.99
Product name is Arsenal Football
Product price is 9.99
Product name is Formula One Cap
Product price is 14.99
Product name is Robin Hood Bow
Product price is 8.99


6 commentaires

Oui c'est une syntaxe étrange. Si vous utilisez une période, il ne cherchera que des descendants directs du nœud que vous êtes la plus déérique. Les trois périodes indiquent de vérifier tous les nœuds sous le nœud actuel.


Cela a fonctionné bien, même si je serais toujours intéressé à savoir comment le faire à l'aide d'objets dactylographiés forts plutôt que anonymes


Vous pouvez ajouter IntelliSense à votre XML à l'aide de l'assistant XML vers Schema à VS2008. Il y a une procédure pas à suivre sur la façon de le faire sur MSDN ici ici MSDN.MicRosoft.com/fr -us / vbasic / bb840042.aspx . Cela facilitera beaucoup plus facilement de développer avec, malheureux, il n'est pas fortement typé. C'est une amélioration cependant!


Grand exemple! Votre création de la variable de produitsDoc est redondante. Vous pouvez interroger des produitsXML directement exactement de la même manière. Il sera de type xelement.


Oh, afin que le compilateur ait vue productsxml en tant que xelement, il doit être à l'intérieur du sous-sol principal ou doit être explicitement déclaré "comme xelement".


@Dennis Palmer, merci pour le compliment :-) Oui, j'ai réalisé que la création de la variable de produitsDoc était redondante, mais le gars qui a posé la question n'utilisait pas en ligne XML. J'ai décidé de l'écrire d'une manière qui serait facilement adaptée pour lire à la place d'un fichier; Par conséquent, j'ai démontré comment utiliser system.xml.linq.xdocument.parse pour charger un xdocument. Je voulais faire mon exemple concis, mais inclure XML réel avec cela afin qu'il puisse être un exemple de travail totalement.



2
votes

Le docteur Jones a posté un excellent exemple!

Pour obtenir une collection d'objets de type nommés par opposition à des objets de type anonyme (les deux sont fortement tapés) Faites ceci: P>

Module Module1

' some products xml to use for this example '
    Dim productsXml As XElement = _
    <Xml>
        <Product>
            <Name>Mountain Bike</Name>
            <Price>59.99</Price>
        </Product>
        <Product>
            <Name>Arsenal Football</Name>
            <Price>9.99</Price>
        </Product>
        <Product>
            <Name>Formula One Cap</Name>
            <Price>14.99</Price>
        </Product>
        <Product>
            <Name>Robin Hood Bow</Name>
            <Price>8.99</Price>
        </Product>
    </Xml>

Class Product

    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 _price As Double
    Public Property Price() As Double
        Get
            Return _price
        End Get
        Set(ByVal value As Double)
            _price = value
        End Set
    End Property

End Class

Sub Main()

    ' get an IEnumerable of Product objects '
    Dim products = From prod In productsXml...<Product> _
                   Select New Product With {.Name = prod.<Name>.Value, .Price = prod.<Price>.Value}

    ' go through each product '
    For Each prod In products
        ' output the value of the <Name> element within product '
        Console.WriteLine("Product name is {0}", prod.Name)
        ' output the value of the <Price> element within product '
        Console.WriteLine("Product price is {0}", prod.Price)
    Next

End Sub

End Module


0 commentaires

0
votes

Je suis peut-être un peu en retard à la fête ici, mais je ne peux pas croire que personne n'a proposé l'option xmlsérializer : xxx

Vous pouvez ensuite renvoyer un iEnumerable du produit de la fonction partagée: xxx

ceci n'utilise pas linqtoxml comme tel, mais il désère le XML à un iNeuble de produit, que vous pouvez utiliser LINQ sur comme d'habitude.


0 commentaires