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

C# Discussion :

Linq to XML: Extraire des elements par nom et attribut


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 22
    Points : 20
    Points
    20
    Par défaut Linq to XML: Extraire des elements par nom et attribut
    Hello ! Me revoila avec encore plus de problemes XML :-)

    J'ai le fichier XML suivant que je dois parser pour en extraire des parametres:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
            <?xml version="1.0" encoding="UTF-8"?>
        <bulkCmConfigDataFile xmlns:un="utranNrm.xsd"  xmlns:xn="genericNrm.xsd" xmlns:gn="geranNrm.xsd"  xmlns="configData.xsd" 
         xmlns:es="Vendor1SpecificAttributes.1.0.xsd">
            <fileHeader fileFormatVersion="1.0" vendorName="Vendor1"/>
            <configData dnPrefix="Undefined">
                <xn:SubNetwork id="ONRM_ROOT_MO_R">
                    <xn:SubNetwork id="RNC0001">
                        <xn:MeContext id="BLABLA">
                        [...]
                        </xn:MeContext>
        		    <xn:MeContext id="MACHIN">
                        [...]
        		    </xn:MeContext>
                        <xn:MeContext id="RNC0001">
                            <xn:VsDataContainer id="RNC0001">
                            </xn:VsDataContainer>
                            <xn:ManagedElement id="1">
                                <un:RncFunction id="1">
                                    <un:UtranCell id="111111A">
                                        <un:attributes>
                                            <un:uarfcnUl>9800</un:uarfcnUl>
                                            <un:uarfcnDl>10700</un:uarfcnDl>
                                        </un:attributes>
                                        <xn:VsDataContainer id="111111A">
                                            <es:Position>
                                            <es:latitudeSign>1</es:latitudeSign>
                                            <es:latitude>3070727</es:latitude>
                                            <es:longitude>8786820</es:longitude>
                                            </es:Position>
                                        </xn:VsDataContainer>
                                        <xn:VsDataContainer id="1">
                                        </xn:VsDataContainer>
                                    </un:UtranCell>
                                    <un:UtranCell id="111111B">
                                         <un:attributes>
                                            <un:uarfcnUl>9800</un:uarfcnUl>
                                            <un:uarfcnDl>10700</un:uarfcnDl>
                                        </un:attributes>
                                        <xn:VsDataContainer id="111111B">
                                            <es:Position>
                                            <es:latitudeSign>1</es:latitudeSign>
                                            <es:latitude>3070555</es:latitude>
                                            <es:longitude>8786666</es:longitude>
                                            </es:Position>
                                        </xn:VsDataContainer>
                                        <xn:VsDataContainer id="1">
                                        </xn:VsDataContainer>
                                    </un:UtranCell>
                                </un:RncFunction>
                            </xn:ManagedElement>
                        </xn:MeContext>
                    </xn:SubNetwork>
                </xn:SubNetwork>
            </configData>
            <fileFooter dateTime="2011-11-28T08:38:45Z"/>
        </bulkCmConfigDataFile>
    Jusqu'a maintenant je n'arrive qu'a extraire le premier element par nom pour un espace de nom donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        XNamespace xn = "genericNrm.xsd";
        XNamespace un = "utranNrm.xsd";
        var test1 = xmldoc.Descendants(xn + "MeContext").FirstOrDefault();
    Ce qui me retourne le premier Element "MeContext" (dans ce cas le MeContext avec id=BLABLA)

    Si j'essaye:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        XNamespace xn = "genericNrm.xsd";
        XNamespace un = "utranNrm.xsd";
        var test1 = xmldoc.Descendants(xn + "MeContext");
    Ce qui d'apres moi devrait me donner une collection des Element au niveau inferieur, test1 = null ...

    1 - Ma premiere question est la suivante: comment extraire un element ayant un attribut donne (et lui seul). Dans mon cas je cherche a extraire le MeContext ayant l'id = RNC0001 et aucun autre. J'ai essaye le code ci-dessous mais ca ne me retourne que des valeurs null.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        XNamespace xn = "genericNrm.xsd";
        IEnumerable<XElement> utrancells =
                                    xmldoc.Root
                                            .Elements(xn + "MeContext")
                                            .Where(el => (string)el.Attribute("id") == "RNC0001");

    2 - Mon second probleme est d'extraire une collection d'elements contenus dans <xn:MeContext id="RNC0001"></xn:MeContext>
    Je voudrais avoir tout les <un:UtranCell id="XXXXX"></un:UtranCell> (leur contenu) dans une collection afin de pouvoir extraire des donnees depuis chacune (chaque element UtranCell represente une entite differente). Par exemple je veux extraire la latitude et la longitude:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        <es:latitude>3070555</es:latitude>
        <es:longitude>8786666</es:longitude>
    depuis chaque <un:UtranCell id="XXXXX"></un:UtranCell>

    Dans cette optique j'ai teste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        XNamespace un = "utranNrm.xsd";
        var test3 = xmldoc.Elements(un + "UtranCell");
        var test4 = test1.Elements(un + "UtranCell");
    et encore une fois cela ne me retourne que des valeurs nulles.

    Merci d'avance !

    Edit: ajout d'un exemple apres le XML sans .FirstOrDefault()

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 570
    Points
    3 570
    Par défaut
    Et avec :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var test12= xmldoc.Descendants(xn + "MeContext").Where(el => (string)el.Attribute("id") == "RNC0001")

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    A force de fouiller les forums et StackOverflow, j'ai fini par trouver ;-)

    Mon erreur etait simplement dans la maniere dont j'attendais les resultats. Je pensais que Descendants renverrait directement une liste a ma variable.

    En fait je dois enumerer cette variable une fois qu'elle a ete assignee ! (Ce n'est marque clairemnent nul part ! ;-))

    En gros je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      var test1bis = xmldoc.Descendants(xn + "MeContext");
     
                foreach (XElement MeContext in test1bis)
                {
                    Console.WriteLine("\r\n" + MeContext.Attribute("id").Value);
                }
    et ca me donne le resultat attendu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BLABLA
     
    MACHIN
     
    RNC0001
    J'ai aussi decouvert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      var test1ter = xmldoc.Descendants(xn + "MeContext").ToList();
    qui est tres pratique

    PS: GuruuMeditation ta methode marche bien aussi une fois que je fais un foreach sur la variable test12. Merci !

  4. #4
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 570
    Points
    3 570
    Par défaut
    Un truc super important à savoir en Linq, c'est que l'exécution de la query n'a lieu que lors de l'enumération, pas lors de l'assignation.

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

Discussions similaires

  1. Afficher des elements par dessus un activeX
    Par greg2 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/07/2011, 10h16
  2. extraire des parties de nom d'un fichier
    Par helaaa dans le forum MATLAB
    Réponses: 2
    Dernier message: 15/05/2010, 11h34
  3. [SimpleXML] Charger un fichier XML comprenant des espaces de nom
    Par nadiaflamingenierie dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 16/01/2008, 10h30
  4. Recuperer des elements par leur id
    Par keul85 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/05/2007, 16h59
  5. comment récupere des element par le nom de la balise?
    Par MASSAKA dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 21/08/2005, 19h59

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