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 :

XML encapsulé dans du XML


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur logiciel en formation
    Inscrit en
    Février 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur logiciel en formation
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2016
    Messages : 13
    Points : 11
    Points
    11
    Par défaut XML encapsulé dans du XML
    Bonjour à tous,

    J'ai un souci de récupération de données XML.

    En effet, ma base de données (que je ne maîtrise pas) stocke des informations en XML. Les informations sur lesquelles je dois travailler sont "encapsulées" dans ce XML, toujours au format XML.

    J'ai "décode" le XML afin de le rendre consultable et "propre", à savoir que tous les termes non gérés (&lt, &gt ...) ont été "convertis" part la méthode HttpUtility.HtmlDecode().

    Voici 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
    protected void Page_Load(object sender, EventArgs e)
            {
                try
                {
                    SqlCommand cmd = new SqlCommand(query, connection);
                    connection.Open();
     
                    SqlDataReader sdr = cmd.ExecuteReader();
     
                    XmlDocument doc = new XmlDocument();
     
                    if(sdr.HasRows)
                    {
                        while(sdr.Read())
                        {
                            string content = sdr["Content"].ToString();
                            System.Diagnostics.Debug.WriteLine(System.Web.HttpUtility.HtmlDecode(content));
     
                            // Test Decode
                            string contenu = System.Web.HttpUtility.HtmlDecode(content);
     
                            doc.Load(contenu);
     
                            XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
                            ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");
                            XmlNode FormId;                       
                            FormId = doc.SelectSingleNode("descendant::StorageObject/Properties/Property/Template/Property[attribute::Name='FormId']", ns);
                            System.Diagnostics.Debug.WriteLine(FormId.OuterXml);
                        }
                    }               
                }
                finally
                {
                    connection.Close();
                }           
            }
    Je me teste sur le XPATH, afin de naviguer dans les noeuds, pour apprendre à le maîtriser, mais j'ai un message d'erreur :
    Nom : Erreur.JPG
Affichages : 221
Taille : 35,0 Ko

    Je ne sais pas si c'est mon code qui ne va pas ( problème avec le "doc" ?), ou si c'est l'encapsulation qui pose problème.

    Voici l'encapsulation en question (je ne vous mets pa tout le code, car il est très long) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <Root>
      <StorageObject Name="OI-GENOUILLERE ODRA-v2" Id="0108f7ac-7853-4543-8ec4-a04cb755ed46" Type="Adviser.Proteor.Library.TemplateImpl">
        <Properties>
          <Property Name="TimeCreated" Value="27/07/2017 11:14:18" /><Property Name="Enabled" Value="True" /><Property Name="TimePublished" Value="01/01/0001 00:00:00" /><Property Name="TimeLastModified" Value="10/11/2017 09:09:29" /><Property Name="Description" Value="" /><Property Name="ObjectContent" Value=""<Template>
            <Component Type="Adviser.Proteor.Library.TemplateImpl">
              <ExtendedProperty Text="OI" Key="Classification" />
              <ExtendedProperty Text="35176af2-b664-42d6-a7ba-5d06602b0500" Key="ClassificationId" />
              <ExtendedProperty Text="GAO" Key="Activity" />
              <ExtendedProperty Text="58d942ea-8cf7-4089-879c-f8633925473b" Key="ActivityId" />
              <ExtendedProperty Text="OI 36" Key="AnatomicalLevel" />
              <ExtendedProperty Text="76418da5-6830-4a49-aed0-b472c11c67c6" Key="AnatomicalLevelId" />
              <ExtendedProperty Text="ORTHESE INF." Key="Type" />
              <ExtendedProperty Text="13b33a27-57ce-4009-8812-00f8578982fd" Key="TypeId" />
              <Version Version.Major="0" Version.Minor="1" />
    à partir de la balise <Property Name="ObjectContent">, la balise n'est pas fermée après le Value (en gras), et ensuite ça repart sur une autre balise (d'où l'encapsulation).

    Need help !!!!

  2. #2
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 899
    Points : 1 916
    Points
    1 916
    Par défaut
    Tu es sûr qu'il est bien formé ton document ? Parce-que ça : <Property Name="ObjectContent" Value=""<Template> je ne trouve pas ça très propre, ça me donne l'impression qu'on a oublié le chevron de fermeture />. Elle est bien fermée quelque part cette balise "Property" ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur logiciel en formation
    Inscrit en
    Février 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur logiciel en formation
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2016
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    En fait, si, il y a bien (et je pense que j'ai du mal recopier la donnée, mais c'est bien comme tel) un " après le Value=, ensuite, il y a toute la donnée XML encaspulée, et ça se termine par " et la fin du chevron.
    Voici le début, avec les guillements :
    Nom : debut.JPG
Affichages : 174
Taille : 28,6 Ko

    Et voici la fin avec les guillemets et la fin de la balise :
    Nom : fin.JPG
Affichages : 155
Taille : 16,6 Ko

    J'ai réussi à me dépatouiller de tout ça en utilisant la méthode Split et ne récupérer que la chaîne de caractères encapsulée utiliser la méthode HtmDecode pour la rendre propre à l'utilisation.

    Puis j'ai fait un Xpath pour récupérer les valeurs des attributs que je voulais (mes tests sont faits sur une seule Id pour le moment).

    Je sais que mon propre peut être optimisé. Qu'en pensez-vous ? je mets tout le code, même celui du split.
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    SqlDataReader sdr;
     
            protected void Page_Load(object sender, EventArgs e)
            {
                try
                {
                    string query = "SELECT Id, Content From Template WHERE Id = '0108f7ac-7853-4543-8ec4-a04cb755ed46' AND Deleted = '0'";
                    SqlCommand cmd = new SqlCommand(query, connection);
                    connection.Open();
                    sdr = cmd.ExecuteReader();
                    XmlDocument doc = new XmlDocument();
                    XmlDocument docComplet = new XmlDocument();
     
                    if (sdr.HasRows)
                    {
                        DataTable dt = new DataTable();
                        dt.Columns.Add("Nom", typeof(string));
                        dt.Columns.Add("test", typeof(string));
     
                        while (sdr.Read())
                        {
                            string complet = sdr["Content"].ToString();
                            RecupContenu();
     
                            System.Diagnostics.Debug.WriteLine(System.Web.HttpUtility.HtmlDecode(RecupContenu()));
     
                            string contenu = System.Web.HttpUtility.HtmlDecode(RecupContenu());
     
                            doc.LoadXml(contenu);
                            docComplet.LoadXml(complet);
     
                            // Test Content
                            System.Diagnostics.Debug.WriteLine("[-- CONTENU --] --> : " + contenu);
     
                            var nodesIdTemp = docComplet.SelectNodes("Root/StorageObject[@Name]");
                            var nodes = doc.SelectNodes("Template//Component/Properties/Property[@Name='FormId']");
     
                            foreach (XmlElement nodeT in nodesIdTemp)
                            {
                                string nameTemp = nodeT.GetAttribute("Name");
                                foreach (XmlElement node in nodes)
                                {
                                    string attributeValue = node.GetAttribute("Value");
                                    System.Diagnostics.Debug.WriteLine("Test : " + attributeValue);
                                    dt.Rows.Add(nameTemp,attributeValue);
                                }
                            }                       
                        }
                        test.DataSource = dt;
                        test.DataBind();
                    }          
                }
                finally
                {
                    connection.Close();
                }        
            }
     
            // Méthode pour se connecter au champs Content et récupérer le contenu dans une variable.
            public string connexionContent(string field, SqlDataReader sdr)
            {
                // enregistrement du contenu du champs Content dans une variable
                string content = sdr[field].ToString();
     
                System.Diagnostics.Debug.WriteLine("[ -- Lecture donnée depuis Méthode connexionContent -- ] ----> : " + content);
     
                return content;
            }
     
            // Méthode pour découper le contenu du champs Content
            public string RecupContenu()
            {
                // Tentative de séparation des deux parties de la chaine de caracteres
                string chaineACouper = "<Property Name=\"ObjectContent\" Value=\"";
                string[] chaineArrive = connexionContent("Content", sdr).Split(new string[] { chaineACouper }, StringSplitOptions.None);
                chaineArrive[0] += chaineACouper;
     
                // Séparation des deux parties.
                string stringPartOne = chaineArrive[0];
                string stringPartTwo = chaineArrive[1];
     
                // Test
                System.Diagnostics.Debug.WriteLine("[-- Lecture donnée depuis RecupContenu() --] ---> : " + stringPartTwo);
     
                string chaineACouperFin = "\" /></Properties></StorageObject></Root>";
                string[] chaineFinale = stringPartTwo.Split(new string[] { chaineACouperFin }, StringSplitOptions.None);
                chaineFinale[1] += chaineACouperFin;
     
                string stringFinale = chaineFinale[0];
     
                // Test
                System.Diagnostics.Debug.WriteLine("[-- Lecture bloc final -- ] --> : " + stringFinale);
     
                return stringFinale;
            }
        }
    Résultat pour le moment :
    Nom : tableau.JPG
Affichages : 303
Taille : 48,7 Ko

    Il faut que je travaille sur la répétition des lignes en les fusionnant, mais c'est normal car il peut y avoir plusieurs valeurs d'attributs pour une seule Id.

Discussions similaires

  1. [WD15] SoapFault non encapsulée dans du XML
    Par Kerfred dans le forum WinDev
    Réponses: 0
    Dernier message: 02/03/2010, 17h30
  2. donnees (video) encapsulé dans xml
    Par milach dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 28/09/2009, 17h42
  3. Réponses: 1
    Dernier message: 11/11/2008, 11h17
  4. Evaluer XML contenu dans du XML
    Par Duc Lebowski dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 17/06/2008, 20h51
  5. Réponses: 2
    Dernier message: 06/07/2006, 08h47

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