IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linq Discussion :

Linq to XML remove éléments


Sujet :

Linq

  1. #1
    Membre chevronné
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Points : 1 839
    Points
    1 839
    Billets dans le blog
    2
    Par défaut Linq to XML remove éléments
    Salut à tous

    J'ai un fichier articles xml, 387M0 pour 3 millions de ligne
    La plupat de ces ligne me sont inutiles.

    J'ai ce petit bout de code qui marche, mais qui met plus 5H à se finir
    ListeBDD : liste de string contenant la liste des constructeurs inutiles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     For Each e As XElement In From ArtXml In LeFichierArticle.LeFichierXml.Element("files.index").Descendants("file").Reverse
                    If ListeBDD.Contains(e.Attribute("Supplier_id").Value) Then
                        e.Remove()
                    End If
                Next
    J'ai vu qu'on pouvait faire ça en une ligne en Linq, mais je ne suis pas parvenu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim ddd2 = From ArtXml In LeFichierArticle.LeFichierXml.Element("files.index").Descendants("file") Select ArtXml.Attribute("Supplier_id").Value
    ça me retourne bien la liste des éléments à supprimer
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (From ArtXml In LeFichierArticle.LeFichierXml.Element("files.index").Descendants("file") Where ListeBDD.Contains(ArtXml.Attribute("Supplier_id").Value) Select ArtXml).remove()
    Me sort une erreur de syntaxe sur la 1ere parenthèse

    Quelqu'un peut-il m'éclairer sur la suppression conditionnelle d'éléments dans un fichier Xml par Linq?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par BROWNY Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (From ArtXml In LeFichierArticle.LeFichierXml.Element("files.index").Descendants("file") Where ListeBDD.Contains(ArtXml.Attribute("Supplier_id").Value) Select ArtXml).remove()
    La méthode Remove doit être appelée sur un élément, et toi tu l'appelles sur une séquence d'éléments... Il faut faire un foreach sur le résultat de la requête.

    Mais de toutes façons, ça n'ira pas plus vite comme ça qu'avec ton code d'origine...

    Je vois 2 points d'amélioration possibles :

    - N'utilise pas Descendants, qui est lent car il cherche parmi tous les descendants. Utilise plutôt Elements, qui ne cherche que les enfants directs (selon la structure de ton document XML, il faudra peut-être modifier un peu la requête)

    - Si ListeBDD contient beaucoup d'éléments, utilise un HashSet<string> plutôt qu'une List<string>

  3. #3
    Membre chevronné
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Points : 1 839
    Points
    1 839
    Billets dans le blog
    2
    Par défaut
    Je te remercie pour ces petites précisions. Au moins je comprend mieux

    J'ai résolu le problème en le contournant

    Mon projet est en SSIS et je pensait que mon pb ne se résoudrait que par le code...
    Naif que je suis
    Mon collègue m'a parlé de son jeune temps ou il faisait du XSLT
    Ce que gère très bien le SSIS avec l'éditeur de tâche XML
    Je commence par supprimer tous les champs inutiles.
    Mon fichier est réduit de plus de moitié en taille.
    Puis, j'utilise un batch 2 fois par semaine pour parcourir le fichier et mettre en BDD les modifs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Linq to XML - accéder à une sous-liste d'un élément
    Par semaro dans le forum Linq
    Réponses: 1
    Dernier message: 17/09/2014, 17h48
  2. remove avec linq to xml
    Par trouffiondesiles dans le forum Silverlight
    Réponses: 4
    Dernier message: 10/10/2010, 19h53
  3. [Linq] to XML : Liste d'élément d'un noeud ?
    Par Ticoche dans le forum C#
    Réponses: 4
    Dernier message: 17/09/2008, 15h14
  4. Réponses: 1
    Dernier message: 30/05/2007, 20h12
  5. [xml][débutant] élément ou attributs...
    Par celestin dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 24/10/2005, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo