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

 .NET Discussion :

Question xpath exception [C#]


Sujet :

.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 78
    Points : 46
    Points
    46
    Par défaut Question xpath exception
    Bonjour,

    Je rencontre une erreur dans mon code que je n'arrive pas bien à interpréter. Je m'explique, j'essaye de parcourir un document xml assez volumineux dans le but de copier (plus exactement de cloner) un nœud et son contenu.

    - Pour se faire je précise un path comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string path = "/a/b/c/d/[@desc=\"une description spécifique\"]";
    - que je passe en paramètre dans une méthode que j'ai créé, dont le début de son contenu est comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    XmlDocument doc = new XmlDocument();
    doc.Load(sourceFile.xml);
    
    for (int i = 1; i <= num; i++)
    {
        XmlNode node = doc.SelectSingleNode(path);
    
        //code de clone mon node autant de fois que je le souhaite..
    
    }

    Au niveau de la ligne de couleur rouge, je catch une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XpathException : L'expression doit être évaluée pour donner une collection de noeuds.
    Je ne comprend pas bien pourquoi "une collection de noeuds" d'autant plus que j'ai bien spécifié que je voulais un SingleNode.

    Merci pour votre aide

  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 749
    Points
    39 749
    Par défaut
    Il me semble qu'il faut utiliser des guillemets simples et non doubles dans l'expression XPath :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string path = "/a/b/c/d/[@desc='une description spécifique']";

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    Merci pour t'as réponse mais j'avais essayé aussi et j'ai exactement la même erreur.

  4. #4
    Membre du Club Avatar de zeecrowddev
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 55
    Points
    55
    Par défaut
    salut

    essaye ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string path = "/a/b/c/d/*[@desc='une description spécifique']";

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    J'ai pas d'erreur mais la valeur de mon node est null, le node que je cherche n'est pas trouvé.

  6. #6
    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 749
    Points
    39 749
    Par défaut
    Pourrais-tu poster le XML ?

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    Le voici, il est simplifié ça veut rien dire mais c'est ça le principe :

    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
    <?xml version="1.0"?>
    <SCL>
     
      <Sub>
        <Vol name="v1">
          <Ba name="q1" desc="une description 1">
            <Node Name="AA" />
          </Ba>
          <Ba name="q2" desc="une description 2">
            <Node Name="BB" />
          </Ba>
        </Vol>
      </Sub>
     
      <Data>
      </Data>
    </SCL>
    donc le path avec lequel je travail est celui là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string pathLNode = "/SCL/Sub/Vol/Ba/[@desc='une description 2']";
    Et voilà mon code :

    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
            public void DoCloningNode(string sourceFile, string pathNode, int num)
            {
                XmlDocument doc = new XmlDocument();
     
                try
                {
                    doc.Load(sourceFile);
     
                    for (int i = 1; i <= num; i++)
                    {
                        XmlNode node = doc.SelectSingleNode(pathLNode);
                        const string pathWhereToClone = "/SCL/Sub/Vol";
     
                        if (node != null)
                        {
     
                            XmlNode clone = node.Clone();
     
                            //Adding clone(s) in the specific path
                            XmlElement element = (XmlElement)doc.SelectSingleNode(pathWhereToClone);
     
                            if (element != null)
                            {
                                    element.AppendChild(clone);
                            }
     
                        }
                    }
     
                    //Saving doc with clones
                    doc.Save(sourceFile);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    Console.ReadLine();
                }
            }

  8. #8
    Membre du Club Avatar de zeecrowddev
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 55
    Points
    55
    Par défaut
    Sub <> sub
    pb de majuscule minuscule je pense

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    Juste une erreur de ma part en recopiant désolé.

  10. #10
    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 749
    Points
    39 749
    Par défaut
    Tu as un "/" en trop après "Ba" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string pathLNode = "/SCL/Sub/Vol/Ba[@desc='une description 2']";

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    Exactement.... Merci pour avoir pointé cette erreur

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

Discussions similaires

  1. question XPath (récupérer un noeud qui a une valeur)
    Par adaneels dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 31/03/2009, 12h05
  2. [XPATH] [DOM4J] Petite question XPath et arborescence
    Par laurent_m dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 19/09/2008, 02h57
  3. Question XPATH très simple
    Par sauceaupistou dans le forum ASP.NET
    Réponses: 8
    Dernier message: 05/08/2008, 12h06
  4. Question générale Exceptions
    Par Ayana dans le forum Langage
    Réponses: 10
    Dernier message: 16/10/2007, 14h54
  5. [XSLT][XPath] Questions diverses
    Par progamer54 dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 10/05/2006, 12h19

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