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

Services Web Discussion :

[C#] Pourquoi un préfixe namespace est bloquant ?


Sujet :

Services Web

  1. #1
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut [C#] Pourquoi un préfixe namespace est bloquant ?
    Bonjour,

    j'ai un web service en C# qui prend en paramètre une string :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    [WebMethod]
    public bool testInsertion(String s) 
    {
      XmlDocument doc = new XmlDocument();
      doc.LoadXml(s);
     
      try 
      {
         string titre = doc.SelectSingleNode
    ("my:insererContenu/my:titre").InnerText;
    //...
    Voici un exemple de données qui sont envoyées au web service :

    <my:insererContenu xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-08-25T08-37-41">
    <my:titre>titre test</my:titre>
    ...
    </my:insererContenu>
    Comme vous pouvez le voir, la définition du namespace "my" est contenue dans l'élément racine.

    Toutefois, le web service plante et quand je débugge avec un espion sur l'expression doc.SelectSingleNode("my:insererContenu/my:titre") il m'indique cette erreur :

    {"Le gestionnaire d'espaces de noms ou XsltContext est requis. Cette requête a un préfixe, une variable ou une fonction définie par l'utilisateur."} System.SystemException
    Si j'ai bien compris, ça voudrait dire que la méthode LoadXML() ne détecte pas la définition du namespace, et que malheureusement on ne peut pas travailler avec des éléments XML préfixés par "my:" par la suite.

    Quelqu'un aurait-il une solution pour contourner cela (même en passant par une autre méthode que LoadXML) ?
    Je précise que la forme de la requête SOAP ne peut pas changer, impossible d'enlever les préfixes "my:"...

    Merci d'avance
    Pensez au bouton

  2. #2
    Membre du Club Avatar de Manralf
    Inscrit en
    Août 2005
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 43
    Points : 48
    Points
    48
    Par défaut
    Bonjour,
    dès que tu as des namespace dans des requêtes XPath, tu dois utiliser la classe XmlNamespaceManager. Voici un petit exemple...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(s);
     
    XmlNamespaceManager nsmgr = new XmlNamespaceManager
    (doc.NameTable);
    nsmgr.AddNamespace("my",
     "http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-08-
    25T08-37-41");
     
    string titre = doc.SelectSingleNode
    ("my:insererContenu/my:titre").InnerText;

  3. #3
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Merci pour ton aide mais ça ne fonctionne pas, j'ai toujours la même erreur...

    Il ne faut pas lier le NamespaceManager au XmlDocument d'une manière ou d'une autre ?


    [edit] Autant pour moi, il fallait rajouter nsmgr en deuxième paramètre de la méthode SelectSingleNode().
    Tout marche maintenant

    [/edit]
    Pensez au bouton

  4. #4
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Finalement ça ne marche plus avec du code XML un poil plus complexe :

    <?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution solutionVersion="1.0.0.50" productVersion="11.0.6357" PIVersion="1.0.0.0" href="file:///D:\Dev\InfoPath\cms_test\CreationContenu\Contenu.xsn" name="urn:schemas-microsoft-com:office:infopath:Contenu:-myXSD-2005-09-20T09-42-47" ?><?mso-application progid="InfoPath.Document"?><?mso-infoPath-file-attachment-present?>

    <my:Contenu xmlnssi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" ... xml:lang="fr">

    <my:titre>azeaz</my:titre>
    ...</my:Contenu>
    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.LoadXml(s);
    XmlNamespaceManager nsmgr = new XmlNamespaceManager
    (doc.NameTable);
    nsmgr.AddNamespace("my",
     "http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-08-
    25T08-37-41");
     
    titre = doc.SelectSingleNode("my:Contenu", nsmgr).InnerText;
    doc.SelectSingleNode("my:Contenu", nsmgr) me renvoie null

    Pourquoi la manipulation de XML en .NET est elle si compliquée ?
    Pensez au bouton

  5. #5
    Membre du Club Avatar de Manralf
    Inscrit en
    Août 2005
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 43
    Points : 48
    Points
    48
    Par défaut
    Pour que ça marche il faudrait que ta balise my:Contenu définisse l'espace de nom "my", en gros que tu aies quelque chose du style :

    <my:Contenu xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-08-25T08-37-41" ... >

  6. #6
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Justement, lorsque je débugge et que je regarde le contenu du document XML après l'instruction nsmgr.AddNamespace(...), les éléments ont exactement la forme que tu cites...
    Et l'élément racine Contenu a bien la définition xmlns:my, c'est juste dans les trois petits points parce que je n'ai pas voulu tout mettre.

    De plus ça marchait très bien pour l'exemple de mon premier post, pourquoi quelque chose d'un chouïa différent ne fonctionnerait plus :
    Pensez au bouton

  7. #7
    Membre du Club Avatar de Manralf
    Inscrit en
    Août 2005
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 43
    Points : 48
    Points
    48
    Par défaut
    En effet c'est surprenant
    Tu peux poster l'intégralité de ton document XML : Il y a peut-être un truc qui m'a échappé...

  8. #8
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Bien sûr :

    <?xml version="1.0" encoding="UTF-8"?>
    <?mso-infoPathSolution solutionVersion="1.0.0.50" productVersion="11.0.6357" PIVersion="1.0.0.0" href="file:///D:\Dev\InfoPath\cms_test\CreationContenu\Contenu.xsn" name="urn:schemas-microsoft-com:office:infopath:Contenu:-myXSD-2005-09-20T09-42-47" ?>
    <?mso-application progid="InfoPath.Document"?>
    <?mso-infoPath-file-attachment-present?>
    <my:Contenu xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns: xhtml="http://www.w3.org/1999/xhtml" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns: ns1="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-09-20T09:42:47" xmlns: xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="fr">
    <my:titre>azeaz</my:titre>
    <my:corps>azeazeazeaze</my:corps>
    <my:internet>0</my:internet>
    <my:restreint>0</my:restreint>
    <my:id_rubrique>Choisissez une rubrique</my:id_rubrique>
    <my:mots_cles>
    <my:mot_cle>azeaze</my:mot_cle>
    <my:mot_cle>azeazerzr</my:mot_cle>
    <my:mot_cle>ppppppppp</my:mot_cle>
    </my:mots_cles>
    <my:acces_restreint>
    <my:id_groupe xsi:nil="true"></my:id_groupe>
    </my:acces_restreint>
    <my:fichier>x0lGQRQAAAABAAAA[fichier attaché encodé en base 64]</my:fichier>
    </my:Contenu>
    Je précise que j'ai aussi essayé en enlevant le fichier, sans succès.
    Pensez au bouton

  9. #9
    Membre du Club Avatar de Manralf
    Inscrit en
    Août 2005
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 43
    Points : 48
    Points
    48
    Par défaut
    Bon d'accord la déclaration de namespace qui nous intéresse est la suivante :

    xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-09-20T09:42:47"
    J'ai l'impression (il faudrait que tu fasses des tests pour confirmer) que la définition de ton espace de nom est dynamique, en fonction de la date et de l'heure

    Il faudrait donc que tu transformes ton code en quelque chose du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(s);
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
    nsmgr.AddNamespace("my",  doc.DocumentElement.NamespaceURI);
     
    titre = doc.SelectSingleNode("my:Contenu", nsmgr).InnerText;
    La propriété NamespaceURI récupère l'URI de l'espace de nom associé à un noeud, avec ça je pense ça devrait aller...

  10. #10
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Ca fonctionne !

    Effectivement je n'avais pas remarqué que le namespace changeait selon l'heure, c'est assez "logique" finalement.

    Merci encore de m'avoir sorti de l'impasse
    Pensez au bouton

  11. #11
    Membre du Club Avatar de Manralf
    Inscrit en
    Août 2005
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 43
    Points : 48
    Points
    48
    Par défaut
    De rien
    Le coup des espaces de noms qui changent pour chaque document c'était vicieux quand même

  12. #12
    Membre éclairé
    Inscrit en
    Mai 2003
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 270
    Points : 721
    Points
    721
    Par défaut
    je permet un up sur ce topic que j ai trouvé via google.

    J ai un problème avec les ajouts de namespace qui concernent les schemas. Je ne parviens pas à utiliser les methods SelectNode à cause de ces déclarations.

    Voici mon fichier 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
    19
    <?xml version="1.0" encoding="UTF-8"?>
    <AUTOSAR xmlns="http://autosar.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://autosar.org autosar.xsd">
       <TOP-LEVEL-PACKAGES>
            <AR-PACKAGE>
         	  <SHORT-NAME>AUTOSAR</SHORT-NAME>
    	  <SUB-PACKAGES>
    	          <AR-PACKAGE>
    		   <SHORT-NAME>Units</SHORT-NAME>
    		   <ELEMENTS>
    			    <UNIT>
    			        <SHORT-NAME>percent</SHORT-NAME>
    			        <DISPLAY-NAME>%</DISPLAY-NAME>
    			    </UNIT>
    		   </ELEMENTS>
    	          </AR-PACKAGE>
    	   </SUB-PACKAGES>
           </AR-PACKAGE>
        </TOP-LEVEL-PACKAGES>
    </AUTOSAR>
    Et mon code src:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    this.xmlDoc = new XmlDocument();
    this.xmlDoc.Load(xmlFilePath);
    if (xmlDoc.DocumentElement.Name != "AUTOSAR")
         throw new ArgumentException(xmlFilePath + " does not describe a proper AUTOSAR XML document.");
    //Create an XmlNamespaceManager for resolving namespaces.
    this.nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
    this.nsmgr.AddNamespace(String.Empty, "http://autosar.org");            
    this.nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    this.nsmgr.AddNamespace("xsi:schemaLocation", "http://autosar.org autosar.xsd"); 
    const string xpath = "/AUTOSAR/TOP-LEVEL-PACKAGES/AR-PACKAGE/SUB-PACKAGES/AR-PACKAGE";
    XmlNodeList nodeList = xmlDoc.SelectNodes(xpath, nsmgr);
    int count = nodeList.Count;
    En supprimant la déclaration des namespaces ds le fichier xml, mon code trouve bien un node. Mais avec, cela ne fonctionne tjs pas. Qqch doit manquer ds les AddNamespace, je ne vois pas quoi.

    Une idée?

  13. #13
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Normalement,pour ton problème il faut ouvrir un nouveau sujet dans le forum C# et non pas dans Services Web.

    Néamoins, concernant ta question, il faut définir un nom pour le namespace xmlns="http://autosar.org"

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    this.nsmgr.AddNamespace("ns", "http://autosar.org");   
     
    //....
     
     
    const string xpath = "/ns:AUTOSAR/ns:TOP-LEVEL-PACKAGES/ns:AR-PACKAGE/ns:SUB-PACKAGES/ns:AR-PACKAGE";
    Mehdi Feki : Modérateur .Net

  14. #14
    Membre éclairé
    Inscrit en
    Mai 2003
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 270
    Points : 721
    Points
    721
    Par défaut
    oui, j ai ouvert un topic entre temps sur la section C#.
    http://www.developpez.net/forums/sho....php?p=2357649

    Je pensais d ailleurs avoir supprimé mon message ici, mais apparement non...
    Merci qd meme pour la réponse.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/09/2006, 10h55
  2. Réponses: 4
    Dernier message: 26/08/2006, 02h01
  3. Réponses: 9
    Dernier message: 29/04/2006, 13h15
  4. pourquoi l'appli quitte quand elle est vide
    Par firejocker dans le forum MFC
    Réponses: 1
    Dernier message: 10/11/2005, 14h20

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