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

Langages Discussion :

Parcours d'un flux XML


Sujet :

Langages

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    569
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 569
    Par défaut Parcours d'un flux XML
    Bonjour,

    J'ai un souci que je n'arrive pas à comprendre
    Je vous mets le bout de code pour 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
     
    XmlElement element = doc.DocumentElement;
    if (element.LocalName == "toto")
    {
        //Récupération des names spaces de cet élément racine
        XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
        nsmgr.AddNamespace(element.Prefix, element.NamespaceURI);                   
        string prefixe = string.IsNullOrEmpty(element.Prefix) ? "" : (element.Prefix + ":");
    //Recherche du noeud 
        XmlNode nodeSearch = element.SelectSingleNode(string.Format("{0}EMET//{0}MESS//{0}TMES//{0}TMES_001", prefixe), nsmgr);
        if (nodeSearch != null)
            m_Envoi.Entete.Echange.RefConversation += "#" + nodeSearch.InnerText;
    }
    Ce que je ne comprends pas, c'estque la recherche du noeud renvoie null alors que le chemin XPath est valide
    Si je fais un test de recherche ainsi : element["EMET"], il va bien me trouver le noeux correspondant

    Le chemin étant à plusieurs étages, çà complique les choses d'enchaîner les element["xxx"] alors que le SelectSingleNode renvoie null facilement si le chemin est incorrect

    Est-ce que quelqu'un a une idée ou une autre technique ?

    Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 771
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 771
    Par défaut
    Tu peux aussi mettre le xml correspondant (en anonymisant les données si nécessaires)

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    569
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 569
    Par défaut
    Voici le fichier anonymisé

    Xml_Anonyme.xml

    Merci pour le coup de main en espérant que l'on comprenne

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 771
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 771
    Par défaut
    Tu aurai pu le mettre dans des balises code plutôt que dans un fichier joint:
    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
    <?xml version="1.0" encoding="utf-8"?>
    <q1:RGCU xmlns:q1="http://www.toto.fr">
      <q1:EMET>
        <q1:EMET_001>xxxx</q1:EMET_001>
        <q1:EMET_002>xxxx</q1:EMET_002>
        <q1:FLUX>
          <q1:FLUX_001>xxxx</q1:FLUX_001>
          <q1:FLUX_002>xxx</q1:FLUX_002>
        </q1:FLUX>
        <q1:MESS d3p1:type="q1:xxxxxx" xmlns:d3p1="http://www.w3.org/2001/XMLSchema-instance">
          <q1:MESS_001>xx</q1:MESS_001>
          <q1:MESS_002>xx</q1:MESS_002>
    	  <q1:TMES>
    		<q1:TMES_001>IdentifiantFichierPourRattachementRetour</q1:TMES_001>
    	  </q1:TMES>
          <q1:CTXT>
            <q1:CTXT_001>xx</q1:CTXT_001>
          </q1:CTXT>
          <q1:ASSU>
            <q1:ASSU_001>xxxxxxxxxxxxx</q1:ASSU_001>
            <q1:ASSU_002>xxxxxxxxx</q1:ASSU_002>
            <q1:ASSU_003>xxxxxxxxx</q1:ASSU_003>
            <q1:ASSU_005>xxxxxx</q1:ASSU_005>
            <q1:ASSU_006>xxxx</q1:ASSU_006>
            <q1:ASSU_007>xxxxx</q1:ASSU_007>
            <q1:DOMA>
              <q1:DOMA_001>x</q1:DOMA_001>
              <q1:QRLR>
                <q1:QRLR_001>x</q1:QRLR_001>
                <q1:QRLR_007>x</q1:QRLR_007>
                <q1:GQR1>
                  <q1:GQR1_005>xx</q1:GQR1_005>
                </q1:GQR1>
              </q1:QRLR>
            </q1:DOMA>
          </q1:ASSU>
        </q1:MESS>
      </q1:EMET>
      <q1:TOTA>
        <q1:TOTA_001>1</q1:TOTA_001>
        <q1:TOTA_002>1</q1:TOTA_002>
      </q1:TOTA>
    </q1:RGCU>

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 771
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 771
    Par défaut
    Sinon element.LocalName me renvoie "RGCU" pour commencer, donc bon, on ne rentre pas dans le if., donc on ne fait pas la recherche voulue.
    En corrigeant ça, ça donne le résultat voulu.

    En suivant pas à pas le déroulé du programme, tu aurais pu facilement trouver le problème.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    569
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 569
    Par défaut
    La petite remarque condescendante n'est pas très sympa.
    Jai 20 ans d'expérience dans le dev, je sais que je n'ai pas fait appel à un coup de main pour rien sur cette bizarrerie que je ne comprends pas

    J'ai mis "toto" dans la discussion mais je fais bien le test sur "RGCU" et je rentre bien dans mon if mais le SelectSingleNode ne me renvoie rien.
    Tu dis que çà te renvoie quelque chose ? Je ne comprends pas pourquoi toi tu as un résultat et pourquoi moi je n'ai rien

    Capture d'écran : Nom : Capture d’écran 2026-03-26 151607.jpg
Affichages : 124
Taille : 73,1 Ko

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 771
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 771
    Par défaut
    Désolé si tu as mal pris ma remarque, mais j'ai fait avec ce que tu m'as donné (je peux pas être certain que tu avais mis le bon LocalName, des erreurs bêtes tout le monde peut en faire, moi le premier)

    En tout cas, testé sur https://www.onlinegdb.com/online_c_compiler# avec le résultat suivant
    Nom : xml1.png
Affichages : 117
Taille : 273,1 Ko

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    569
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 569
    Par défaut
    C'est fou que çà fonctionne chez toi et pas chez moi
    Merci d'avoir regarder mais là je sèche

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 652
    Par défaut
    Quelle version du Framework ?
    L'encodage du "vrai" fichier est cohérent ?
    etc ...

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 771
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 771
    Par défaut
    Tu l'as peut-être déjà fait, mais est-ce que tu as testé dans un tout nouveau projet "vierge" ?
    ton projet est dans quelle version de .NET ?

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    569
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 569
    Par défaut
    Framework 4.8

    Je n'ai pas essayé de prendre mon bout de code et de le mettre dans une nouvelle solution
    L'encodage du fichier est cohérent

    Dans l'esprit, tout fonctionne très bien mais j'ai ce besoin de rajouter une lecture du XML dans de très rare cas.

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 706
    Par défaut
    Bonjour,
    Citation Envoyé par helios77 Voir le message
    je fais bien le test sur "RGCU" et je rentre bien dans mon if mais le SelectSingleNode ne me renvoie rien.
    Avez vous testé un double slash en début d'expression ? afin d'effectuer une recherche descendante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XmlNode nodeSearch = element.SelectSingleNode(string.Format("//{0}EMET//{0}MESS//{0}TMES//{0}TMES_001", prefixe), nsmgr);
    Autrement vous pouvez vous tourner vers Linq pour XML :
    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
                XDocument xdoc = XDocument.Load("MonFichierXml.xml");
                XElement xelement = xdoc.Root;
                // Récupérer le namespace du XML.
                XNamespace ns = xelement.Name.Namespace;
     
                if (ns != null)
                {
                    // Rechercher le nœud parent (par la combinaison du namespace et de son nom).
                    XElement parent = xelement.Descendants(ns + "EMET").FirstOrDefault();
     
                    if (parent != null)
                    {
                        // Rechercher le nœud enfant en combinant namespace et son nom local et récupérer sa valeur.
                        var el = parent.Descendants(ns + "TMES_001").FirstOrDefault();
                        string nodeSearchValue = el?.Value;
                        Tb1.AppendText("nodeSearchValue : " + nodeSearchValue + Environment.NewLine);
                    }
                }

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    569
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 569
    Par défaut
    Bonjour,

    Je pense que c'est une question de namespace
    Ce qui est étrange, çà fonctionne dans une autre méthode mais pas dans celle-ci alors que je suis dans la même librairie

    C'est pour cela que je soupçonne un truc en rapport avec les namespace au chargement des données mais je tourne en rond pour le moment

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    569
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 569
    Par défaut
    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
     
    <RGCU xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.cnav.fr/rgcu">
    	<EMET>
    		<EMET_001>xxxx</EMET_001>
    		<EMET_002>xxx</EMET_002>
    		<FLUX>
    			<FLUX_001>xx</FLUX_001>
    			<FLUX_002>xx</FLUX_002>		
    		</FLUX>
    		<MESS xsi:type="xxx">
    			<MESS_001>x</MESS_001>
    			<MESS_002>x</MESS_002>
    			<TMES>
    				<TMES_001>Test</TMES_001>
    			</TMES>
    			<CTXT>
    				<CTXT_001>x</CTXT_001>
    			</CTXT>
    ..........
    Fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    element.SelectSingleNode("EMET//MESS//TMES//TMES_001")
    Fonctionne mais pas pratique à utiliser pour ce que je veux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    element["EMET"]["MESS"]["TMES"]["TMES_001"]
    Dans cette configuration, le SelectSingleNode fonctionne
    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
     
    <q1:RGCU xmlns:q1="http://www.cnav.fr/rgcu">
    	<q1:EMET>
    		<q1:EMET_001>xx</q1:EMET_001>
    		<q1:EMET_002>xx</q1:EMET_002>
    		<q1:FLUX>
    			<q1:FLUX_001>xx</q1:FLUX_001>
    			<q1:FLUX_002>xx</q1:FLUX_002>
    		</q1:FLUX>
    		<q1:MESS d3p1:type="q1:xx" xmlns:d3p1="http://www.w3.org/2001/XMLSchema-instance">
    			<q1:MESS_001>xx</q1:MESS_001>
    			<q1:MESS_002>xx</q1:MESS_002>
    			<q1:TMES>
    				<q1:TMES_001>IdentifiantFichierPourRattachementRetour</q1:TMES_001>
    			</q1:TMES>
    			<q1:CTXT>
    				<q1:CTXT_001>01</q1:CTXT_001>
    			</q1:CTXT>
    ................

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    569
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 569
    Par défaut
    Je confirm le la piste du namespace

    En déserialisant mon objet avec false pour ne pas les prendre en compte, le SelectSingleNode fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    doc.LoadXml(XmlUtilities.Serialize(s, false, Encoding.UTF8));
    Du coup, mon fichier de sortie est un peu différent avec des préfixes partout mais ce n'est normalement pas dérangeant

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 706
    Par défaut
    Bonjour,
    Voici un article en rapport avec le sujet : Problèmes de requêtes XPath en C# avec les espaces de noms XML

    Si le document possède un Namespace déclaré par défaut (xmlns="…") tous les éléments sont qualifiés par cet espace de noms, même si aucun préfixe n’apparaît dans le XML.
    Dans cet article,il est dit que XPath omet le Namespace si il n'est pas préfixé.
    Alors la requête XPath recherchera des éléments non qualifiés, aucune correspondance ne sera donc trouvée et SelectSingleNode renverra null.

    Pour résoudre ce problème, il est possible -entre autres- de mapper le namespace par défaut (sans préfixe) à un préfixe temporaire (exemple "default").
    Le namespace ajouté au XmlNamespaceManager sera alors reconnu et exploité par la requête Xpath.

    Le code suivant à tester (pour les cas de NameSpace avec ou sans préfixe) :
    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
                XmlDocument doc = new XmlDocument();
                doc.Load("MonFichierXml.xml");
                XmlElement element = doc.DocumentElement;
     
                if (element.LocalName == "RGCU")
                {
                    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
     
                    string prefixe = string.IsNullOrEmpty(element.Prefix) ? "default:" : (element.Prefix + ":");
                    nsmgr.AddNamespace(prefixe.TrimEnd(':'), element.NamespaceURI);
     
                    XmlNode nodeSearch = element.SelectSingleNode(string.Format("{0}EMET//{0}MESS//{0}TMES//{0}TMES_001", prefixe), nsmgr);//  //*[local-name()='TMES_001']
     
                    if (nodeSearch != null)
                    {
                        string nodeSearchValue = nodeSearch.InnerText;
     
                    }
                }

  17. #17
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    569
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 569
    Par défaut
    Bonjour,

    Merci pour l'article et l'exemple de code.
    Je viens de tester et çà fonctionne, on était bien sur une anomalie avec les namespace

    Du coup, j'utliise cette solution me permettant d'avoir un fichier en sortie sans préfixe, ce que je préfère

    Merci

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

Discussions similaires

  1. flux xml parcours et récupération des valeurs
    Par altair8080 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 10/07/2010, 14h29
  2. [SOAP][C#]envoi d'un flux xml en SOAP
    Par prez dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 25/04/2005, 17h57
  3. [FLASH MX2004] Créer un flux xml
    Par j0hnmerrick dans le forum Flash
    Réponses: 3
    Dernier message: 23/02/2005, 12h02
  4. [XSL] Afficher un flux XML
    Par minimoi1234 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 18/02/2005, 09h35
  5. [DOM] Comment créer des flux XML en java ?
    Par nean_j dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 27/04/2004, 12h00

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