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

C# Discussion :

[C#/System.XML] Pourquoi ai-je un souci avec un namespace sans préfixe ?


Sujet :

C#

  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#/System.XML] Pourquoi ai-je un souci avec un namespace sans préfixe ?
    Bonjour,

    Suite à ce post, j'ai un nouveau problème mais qui concerne cette fois un élément XML (img) avec un namespace mais sans préfixe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <my:corps>
     <img xmlns="http://www.w3.org/1999/xhtml" style="WIDTH: 1036px;
     HEIGHT: 133px" tabIndex="-1" ...> ... </img>
    </my:corps>
    Je récupère le premier élément comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    XmlNamespaceManager nsmgr = new XmlNamespaceManager
    (doc.NameTable);
    nsmgr.AddNamespace("my", doc.DocumentElement.NamespaceURI);
    XmlNode noeud_corps = doc.SelectSingleNode("my:Contenu/my:corps",
     nsmgr);
    Cela fonctionne, j'ai bien noeud_corps avec le bon contenu dedans.

    Mais lorsque j'essaie de récupérer les éléments <img> qui sont à l'intérieur de noeud_corps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    XmlNodeList images = noeud_corps.SelectNodes("img");
    ça me renvoie une valeur nulle.

    J'ai un peu tout essayé (utiliser le namespaceManager dans le SelectNodes, ajouter un namespace http://www.w3.org/1999/xhtml avec un préfixe vide...) mais rien n'y fait.
    Ca ne marche pas non plus en faisant un simple SelectSingleNode, mais de toute façon il peut y avoir plusieurs <img> donc le SelectNodes est nécessaire.

    Merci d'avance si vous pouvez éclairer ma lanterne
    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,

    suite à ce post je te réponds à nouveau

    J'ai un peu tout essayé (utiliser le namespaceManager dans le SelectNodes, ajouter un namespace "http://www.w3.org/1999/xhtml" avec un préfixe vide...) mais rien n'y fait.
    A priori je dirais qu'il faut effectivement rajouter le namespace vide avec l'URI que tu indiques. Mais tu n'as pas l'air de passer l'objet nsmgr en paramètre de la méthode SelectNodes... Donc je te propose d'essayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
    nsmgr.AddNamespace("my", doc.DocumentElement.NamespaceURI);
    nsmgr.AddNamespace(string.Empty, "http://www.w3.org/1999/xhtml");
    XmlNode noeud_corps = doc.SelectSingleNode("my:Contenu/my:corps", nsmgr);
    XmlNodeList images = noeud_corps.SelectNodes("img", nsmgr);

  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
    Salut Manralf,

    Malheureusement ta proposition ne fonctionne pas
    Je suis en train d'écumer les ressources MSDN pour voir si il y a une solution, ça doit être faisable quand même !
    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
    J'ai oublié de dire que l'élément <img> possédait un attribut xd:inline contenant l'image encodée en base 64. Cet attribut est souvent très long.

    Peut-être que ça dépasse la taille maximale possible des attributs d'un XmlNode ?
    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
    Dans le code que je t'ai proposé, la variable "images" a la valeur null ? Ou alors c'est après que ça ne marche pas ?

  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
    Citation Envoyé par Manralf
    Dans le code que je t'ai proposé, la variable "images" a la valeur null ? Ou alors c'est après que ça ne marche pas ?
    Elle n'est pas nulle mais elle contient zéro XmlNode, ce qui revient à peu près au même (quand je fais un foreach dessus il ne rentre même pas dans la boucle)...
    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
    Comme pour l'autre message, tu peux poster un exemple complet : On va bien finir par trouver

  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
    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
     
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(s);
    XmlNamespaceManager nsmgr = new
     XmlNamespaceManager(doc.NameTable);
    nsmgr.AddNamespace("my",
     doc.DocumentElement.NamespaceURI);
     
    //...
     
    // Décodage des évetuelles images en base 64
    XmlNode noeud_corps =
     doc.SelectSingleNode("my:Contenu/my:corps", nsmgr);
    nsmgr.AddNamespace(string.Empty,
     "http://www.w3.org/1999/xhtml"); 
    XmlNodeList images =
     noeud_corps.SelectNodes("img", nsmgr);
    int cptr_img=0;
    foreach (XmlNode image in images) 
    {
      cptr_img++;
      byte[] img = Convert.FromBase64String(
    image.Attributes["xd:inline"].InnerText );
      MemoryStream memStr = new
     MemoryStream();
      memStr.Write( img, 0, img.Length );
      Image pct = Image.FromStream( memStr );
      string sPictureFormat =  
    image.Attributes["xd:inline"].InnerText.Substring(0,4);
      if("R0lG" == sPictureFormat)
         pct.Save(id_contenu.ToString() + 
    cptr_img.ToString() + ".gif", System.Drawing.Imaging.ImageFormat.Gif);
      else
         pct.Save(id_contenu.ToString() + 
    cptr_img.ToString() + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    }
    un exemple de 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    <?xml version="1.0" encoding="UTF-8"?>
    <?mso-infoPathSolution 
    solutionVersion="1.0.0.55" productVersion="11.0.6357" PIVersion="1.0.0.0" 
    href=<a href="file:///D:\Dev\InfoPath\cms_test\CreationContenu\Contenu.xsn" target="_blank">file:///D:\Dev\InfoPath\cms_test\Cre...nu\Contenu.xsn</a>
    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=<a href="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" target="_blank">http://schemas.microsoft.com/office/...taFormSolution</a>
     xmlns:tns=<a href="http://tempuri.org/" target="_blank">http://tempuri.org/</a>
    xmlns:soap=<a href="http://schemas.xmlsoap.org/soap/envelope/" target="_blank">http://schemas.xmlsoap.org/soap/envelope/</a>
    xmlns:xhtml=<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>
    xmlns:mime=<a href="http://schemas.xmlsoap.org/wsdl/mime/" target="_blank">http://schemas.xmlsoap.org/wsdl/mime/</a>
    xmlns:tm=<a href="http://microsoft.com/wsdl/mime/textMatching/" target="_blank">http://microsoft.com/wsdl/mime/textMatching/</a>
    xmlns:soapenc=<a href="http://schemas.xmlsoap.org/soap/encoding/" target="_blank">http://schemas.xmlsoap.org/soap/encoding/</a>
    xmlns:ns1=<a href="http://schemas.xmlsoap.org/wsdl/soap/" target="_blank">http://schemas.xmlsoap.org/wsdl/soap/</a>
    xmlns:http=<a href="http://schemas.xmlsoap.org/wsdl/http/" target="_blank">http://schemas.xmlsoap.org/wsdl/http/</a>
    xmlns:wsdl=<a href="http://schemas.xmlsoap.org/wsdl/" target="_blank">http://schemas.xmlsoap.org/wsdl/</a>
    xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2005
    -09-20T09:42:47"
     xmlns:xd=<a href="http://schemas.microsoft.com/office/infopath/2003" target="_blank">http://schemas.microsoft.com/office/infopath/2003</a>
     xml:lang="fr">
    <my:titre>test_picture</my:titre>
    <my:corps>
    <img xmlns="http://www.w3.org/1999/xhtml" style="WIDTH: 1036px;
     HEIGHT: 133px" tabIndex="-1" src="msoinline/b2f434e35ed54836" 
    xd:inline="/9j/4AAQSkZJRgABAQEASABIAAD/
    2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkME
    Q8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBw
    eHx7KKACiiigAooooAKKiiigAooooA//2Q=="/>
    </my:corps>
    <my:internet>0</my:internet><my:restreint>0</my:restreint>
    <my:id_rubrique>1</my:id_rubrique>
    <my:mots_cles><my:mot_cle></my:mot_cle></my:mots_cles>
    <my:acces_restreint><my:id_groupe xsi:nil="true"></my:id_groupe>
    </my:acces_restreint><my:fichier>zerzer</my:fichier>
    </my:Contenu>
    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
    J'ai trouvé ! Il ne fallait pas utiliser le namespace par défaut, mais l'espace de nom xhtml... En effet, si tu regardes au niveau de la balise my:Contenu tu verras que "xhtml" correspond à l'URI "http://www.w3.org/1999/xhtml", qui est utilisé par la balise "img"...

    Tu dois transformer ton code comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
    nsmgr.AddNamespace("my", doc.DocumentElement.NamespaceURI); 
    nsmgr.AddNamespace("xd", "http://schemas.microsoft.com/office/infopath/2003");
    nsmgr.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml"); 
     
    XmlNode noeud_corps = doc.SelectSingleNode("my:Contenu/my:corps", nsmgr); 
    XmlNodeList images = noeud_corps.SelectNodes("xhtml:img", nsmgr);
    foreach(XmlNode node in images)
      Console.WriteLine(images[0].Attributes["xd:inline"].InnerText);
    @+

  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
    Effectivement, ça fonctionne

    Je pensais que c'était la présence d'un préfixe qui déterminait le namespace à utiliser et non l'inverse...

    Merci encore pour ton aide
    Pensez au bouton

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/01/2012, 16h31
  2. Réponses: 10
    Dernier message: 07/07/2006, 14h26
  3. Réponses: 2
    Dernier message: 31/10/2005, 22h04
  4. [Système][Path]pourquoi j´ai pas de Classpath?
    Par lobiman dans le forum Général Java
    Réponses: 7
    Dernier message: 17/02/2005, 09h35

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