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] Récupérer la valeur d'un attribut


Sujet :

Linq

  1. #1
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut [Linq to Xml] Récupérer la valeur d'un attribut
    J'essaie d'écrire une rewuete linq pour récupérer dans un noeud

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <Topic r:id="Top/Arts/Movies/Titles/1/1984_-_1984">
      <catid>460423</catid>
      <link r:resource="<a href="http://www.geocities.com/aaronbcaldwell/1984.html%22/" target="_blank">http://www.geocities.com/aaronbcaldwell/1984.html"/</a>>
      <link r:resource="<a href="http://orwell.ru/a_life/movies/m84_01.htm%22/" target="_blank">http://orwell.ru/a_life/movies/m84_01.htm"/</a>>
      <link r:resource="<a href="http://www.britmovie.co.uk/genres/fiction/filmography/014.html%22/" target="_blank">http://www.britmovie.co.uk/genres/fiction/filmography/014.html"/</a>>
      <link r:resource="<a href="http://adrianmco.batcave.net/1984.htm%22/" target="_blank">http://adrianmco.batcave.net/1984.htm"/</a>>
      <link r:resource="<a href="http://www.filmtracks.com/titles/1984.html%22/" target="_blank">http://www.filmtracks.com/titles/1984.html"/</a>>
      <link r:resource="<a href="http://us.imdb.com/title/tt0087803/%22/" target="_blank">http://us.imdb.com/title/tt0087803/"/</a>>
    </Topic>

    les propriétés r:resource.

    Pour ce faire j'ai écrit le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    XNamespace n = <a href="http://www.w3.org/TR/RDF/" target="_blank">http://www.w3.org/TR/RDF/</a>;
     
    XDocument doc = XDocument.Load(new XmlTextReader(File.OpenRead(z)));
    var x = from i in doc.Elements("Topic")
    select new
    {
    Uri = i.Element("link").Attribute(n + "resource").Value
    };
    foreach (var f in x)
    {
    Console.WriteLine(">> " + f.Uri);
    }
    Il ne plante pas mais rien ne se passe en fait.

    Le fichier XML en question est un morceau de l'annuaire DMOZ dispo ici

    http://rdf.dmoz.org/rdf/content.example.txt

    Merci de votre aide
    Viva la viva... en el chorizo de la corida de leon.... (cette phrase n'a aucun sens je sais )

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Si tu ne gères pas l'espace de noms par défaut (xmlns) ça ne risque pas de fonctionner.
    Ensuite, les balises Topic sont forcément incluses dans la racine du XML, ce que tu ne gère pas non plus.

    Sinon, pour charger ton XML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XDocument doc = XDocument.Load(new XmlTextReader(File.OpenRead(z)));
    avec ce code tu crées deux objets de type flux (XmlTextReader et FileStream) mais comme tu ne gardes pas de référence dessus tu ne peux pas libérer l'ensemble proprement, ce qui peut éventuellement poser problème.

    Donc plutôt passer directement par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XDocument doc = XDocument.Load(z);
    Ce sera plus simple. Si tu as besoin d'utiliser un flux (généralement parce que l'encodage est spécifique)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    XDocument doc;
    using (StreamReader reader = new StreamReader(z, monEncodage))
    {
        doc = XDocument.Load(reader);
    }
    ...
    Donc passons maintenant à la gestion des espaces de noms du XML. On déclare les chaines associées dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Espace de noms par défaut (très important, sert pour tous les éléments sans préfixe d'espace de noms)
    XNamespace defaultNamespace = "http://dmoz.org/rdf";
    // Autres espaces de noms
    XNamespace namespaceR = "http://www.w3.org/TR/RDF/";
    Ensuite on les utilise dans la requête. Important, ne pas oublier de partir de la racine du document XML (balise RDF). De plus, certaines balises Topic n'ont pas d'enfants link, il faut donc y faire attention, ce que tu ne faisais pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var x = from topic in doc.Root.Elements(defaultNamespace + "Topic")
            from link in topic.Elements(defaultNamespace + "link")
            select new
            {
                Uri = link.Attribute(namespaceR + "resource").Value
            };
    Pour le fun, la version XPath (sans LINQ), ça peut toujours servir.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    XPathDocument xpathDoc = new XPathDocument(z);
    XPathNavigator nav = xpathDoc.CreateNavigator();
     
    XmlNamespaceManager mng = new XmlNamespaceManager(nav.NameTable);
    mng.AddNamespace("rdf", "http://dmoz.org/rdf");
    mng.AddNamespace("r", "http://www.w3.org/TR/RDF/");
     
    XPathNodeIterator itor = nav.Select("/rdf:RDF/rdf:Topic/rdf:link/@r:resource", mng);
     
    foreach (XPathItem item in itor)
    {
        Console.WriteLine(">> " + item.Value);
    }
    La requête XPath pouvant être simplifiée à l'extrême éventuellement (//@r:resource). Personnellement je trouve plus simple avec XPath, mais c'est une question d'habitude je pense
    Pas de questions techniques par MP

  3. #3
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut
    Mille merci pour ton aide StormimOn sa marche niquel.

    Si j'utilise un XmlTextReader c'est parceque le fichier que je vais devoir traiter fera 2go
    Viva la viva... en el chorizo de la corida de leon.... (cette phrase n'a aucun sens je sais )

  4. #4
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par teddyalbina Voir le message
    Si j'utilise un XmlTextReader c'est parce que le fichier que je vais devoir traiter fera 2go
    Si le XDocument se comporte comme le XmlDocument au niveau du chargement, que tu utilises un XmlTextReader ou non n'y changera rien, tout sera en mémoire. Tu seras vite fixé lorsque tu traiteras ton fichier de 2Go ^^
    Pas de questions techniques par MP

  5. #5
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Si le XDocument se comporte comme le XmlDocument au niveau du chargement, que tu utilises un XmlTextReader ou non n'y changera rien, tout sera en mémoire. Tu seras vite fixé lorsque tu traiteras ton fichier de 2Go ^^
    Je viens de m'en rendre compte le pc a eu mal , comment faire alors
    Viva la viva... en el chorizo de la corida de leon.... (cette phrase n'a aucun sens je sais )

  6. #6
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    C'est ce dont je parlais sur ton autre sujet avec la lecture d'un gros fichier XML. La lecture avec un curseur (XmlTextReader) est le seul moyen de procéder je pense, pour les fichiers très volumineux en tout cas.
    Pas de questions techniques par MP

  7. #7
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut
    J'ai trouvé voici la solution

    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
     
     
    XmlTextReader v = new XmlTextReader(z);
    while (v.Read())
    {
    switch (v.NodeType)
    {
    case XmlNodeType.Element:
    if (v.LocalName.Equals("link"))
    {
    Console.WriteLine(v.GetAttribute("r:resource"));
    }
    break;
    default:
    break;
    }
    }
    v.Close();
    Encore merci StormimOn
    Viva la viva... en el chorizo de la corida de leon.... (cette phrase n'a aucun sens je sais )

  8. #8
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Si cela fonctionne bien sur ton fichier de 2Go, n'oublie pas de cliquer sur

    Au passage, met ton ancien sujet en résolu aussi à ce moment (parsing d'un gros fichier XML) en indiquant la solution.
    Pas de questions techniques par MP

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

Discussions similaires

  1. [XML] PHP & XML récupèrer un valeur
    Par cooltechfr dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 30/04/2012, 18h56
  2. [XML] Récupérer la valeur des attributs
    Par Elyon64 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/03/2008, 19h07
  3. [DOM XML] Récupérer la valeur d'un attribut xml
    Par fast462 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 04/06/2007, 10h16
  4. [C#-XML] Récupérer les valeurs des noeuds enfants
    Par cyllix dans le forum Windows Forms
    Réponses: 1
    Dernier message: 23/06/2006, 11h54

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