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

XSL/XSLT/XPATH XML Discussion :

[XPath] Problème pour rechercher des caractères spéciaux


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut [XPath] Problème pour rechercher des caractères spéciaux
    Bonjour,

    J'aimerait faire une requête XPath pour rechercher les noeuds d'un certain type dont un attribut a une valeur spécifiée par l'utilisateur. Le problème est que cette valeur peut contenir n'importe quel caractère, y compris des " et des '. Tant que je reste en XML, pas de problème, ces caractères sont convertis au besoin en " et ' mais en XPath, ça n'a pas l'air de marcher. Voici par exemple mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0" encoding="utf-8"?>
    <Root>
      <Port id="toto">1</Port>
      <Port id="l'oiseau& quot;">2</Port>
      <Port id='l& apos;oiseau"'>3</Port>
    </Root>
    Et un bout de code reproduisant le problème (écrit en C# avec le moteur XPath de Microsoft, mais j'ai le même problème avec libxml++) :

    Code C# : 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
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Xml;
    using System.Xml.XPath;
     
    namespace TesXPath
    {
    	class Program
    	{
    		static void ParseFile(string file)
    		{
    			XmlDocument doc = new XmlDocument();
    			doc.Load(file);
    			XmlNodeList list = doc.SelectNodes("Root/Port[@id='l&apos;oiseau\";']");
    			foreach (XmlElement current in list)
    			{
    				Console.WriteLine(current.OuterXml);
    			}
    		}
    		static void Main(string[] args)
    		{
    			ParseFile("Test.xml");
    		}
    	}
    }

    J'ai essayé avec diverses variantes sans succès. J'arrive à rechercher une chaîne ne contenant ques de ' (en la délimitant par "), ou une chaîne ne contenant que des " (en la délimitant par des '), mais pas une chaîne contenant les deux.

    Merci de votre aide.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    Le moteur XPath, contrairement au parseur XML, traite les expressions XPath comme de simples chaînes, il ne substitue pas les entités. Ca ne pose généralement pas de problèmes, sauf dans ton cas où tu utilises des littéraux chaines dans un prédicat, chaînes qui contiennent des caractères susceptibles de tromper l'analyseur XPath...

    La seule solution de contournement que je vois serait d'assembler la chaîne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /Root/Port[@id=concat("l'oiseau", '"')]
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Merci pour l'info, ça confirme bien mes craintes... Je dois avouer que sur le coup, je suis un peu déçu de XPath...

    Je vais donc mettre en place une pré-analyse de ma chaine à rechercher, pour la découper et la remplacer par les expressions concat qui vont bien.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par JolyLoic
    Je dois avouer que sur le coup, je suis un peu déçu de XPath...
    Pour prendre la défense de XPath, il faut se souvenir que ce langage a été conçu à l'origine pour être utilisé avec XSLT. Et le fait est que ce genre de problème se résoud facilement avec XSLT, en utilisant dans le prédicat une variable qui contient la chaîne.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

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

Discussions similaires

  1. Problème pour supprimer les caractères spéciaux des noms de fichiers
    Par Steph84563 dans le forum Shell et commandes POSIX
    Réponses: 0
    Dernier message: 15/04/2014, 10h28
  2. XML : Problème d'affichage des caractères spéciaux
    Par steph43800 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 11/07/2007, 09h18
  3. [AJAX] Affichage des caractères spéciaux
    Par mitmit dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/04/2007, 13h47
  4. Problèmes pour sauver des caractères dans un input
    Par kalash_jako dans le forum Langage
    Réponses: 3
    Dernier message: 23/04/2006, 21h10

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