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 XElement fonction add


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut XML XElement fonction add
    Bonjour,

    Je débute avec C# et XML.

    Je parts d'une base de données et j'ai récupéré les données d'une table que je dois transformer en XML.

    La datatable s'appelle 'agentService'.

    Je dois obtenir ceci (j'ai switché les données):
    J'ai mis de l'indentation mais elle disparait.

    <NaturalPerson>
    <INSS></INSS>
    <WorkerName></WorkerName>
    <WorkerFirstName></WorkerFirstName>
    etc
    </NaturalPerson>
    <NaturalPerson>
    <INSS></INSS>
    <WorkerName></WorkerName>
    <WorkerFirstName></WorkerFirstName>
    etc
    </NaturalPerson>
    <NaturalPerson>
    <INSS></INSS>
    <WorkerName></WorkerName>
    <WorkerFirstName></WorkerFirstName>
    etc
    </NaturalPerson>

    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
    public NaturalPerson()
            {
     
                this.getAgentService();
                for (int i = 0; i < this.agentService.Rows.Count; i++)
                {
                    XElement naturalPerson1 = new XElement("NaturalPerson",
                        new XElement("INSS", this.agentService.Rows[i]["U2LID_N_REG_NATIONAL_C"].ToString()),
                        new XElement("WorkerName", this.agentService.Rows[i]["U2PPH_NOM_PERS_PHYSIQUE"].ToString()),
                        new XElement("WorkerFirstName", this.agentService.Rows[i]["U2PPH_PRENOM_PERS_PHYSIQUE"].ToString()),
                        new XElement(new HistoricalAttestationInformation().getHistoricalAttestationInformation())
                    );
                    //Test pour vérifier si naturalPerson n'est pas encore instantié
                    if (this.naturalPerson == null)
                    {
                        this.naturalPerson = new XElement(naturalPerson1);
                    }
                    else
                        this.naturalPerson.Add(naturalPerson1);
                }
            }
    J'utilise la fonction ADD de XElement.

    Et voici ce que j'obtient, j'ai cherché mais en vain à résoudre ce problème.

    Le premier naturalPerson contient les autres et je ne vois pas de moyen de contourner ça.

    <NaturalPerson>
    <INSS></INSS>
    <WorkerName></WorkerName>
    <WorkerFirstName></WorkerFirstName>
    etc
    <NaturalPerson>
    <INSS></INSS>
    <WorkerName></WorkerName>
    <WorkerFirstName></WorkerFirstName>
    etc
    </NaturalPerson>
    <NaturalPerson>
    <INSS></INSS>
    <WorkerName></WorkerName>
    <WorkerFirstName></WorkerFirstName>
    etc
    </NaturalPerson>
    <NaturalPerson>
    <INSS></INSS>
    <WorkerName></WorkerName>
    <WorkerFirstName></WorkerFirstName>
    etc
    </NaturalPerson>
    </NaturalPerson>

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    C'est parce que tu rajoute les NaturalPerson comme elements du 1er NaturalPerson (Je ne sais pas si c'est clair )

    Une solution serait d'avoir un élément root, et de rajouter les NaturalPerson à celui-ci.

    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
     
    var RootElement = new XElement("Root");
    this.getAgentService();
    for (int i = 0; i < this.agentService.Rows.Count; i++)
    {
      XElement naturalPerson1 = new XElement("NaturalPerson",
         new XElement("INSS", this.agentService.Rows[i]["U2LID_N_REG_NATIONAL_C"].ToString()),
         new XElement("WorkerName", this.agentService.Rows[i]["U2PPH_NOM_PERS_PHYSIQUE"].ToString()),
         new XElement("WorkerFirstName", this.agentService.Rows[i]["U2PPH_PRENOM_PERS_PHYSIQUE"].ToString()),
         new XElement(new HistoricalAttestationInformation().getHistoricalAttestationInformation())
         );
     
      RootElement.Add(naturalPerson1);
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut
    Oui,

    J'avais compris.

    Le problème est qu'on ne peut pas instancier un XElement vide.

    Si on pouvait le faire, il suffirait de faire une série de add pour ajouter l'un à la suite des autres.

    La manière de faire que tu proposes ne résoud pas le problème puisque j'ai un élément 'root' qui ne peut pas se trouve là.

  4. #4
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Si tu veux avoir juste le XML, tu peux faire :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var xml = String.Concat(root.Nodes().Select(x => x.ToString()).ToArray());

    là tu obtiens un XML comme celui que tu cherches.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut
    Merci Guruumeditation

    J'ai été en congé deux semaines, désolé.

    Juste une question sur ton code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var xml = String.Concat(root.Nodes().Select(x => x.ToString()).ToArray());
    Que représente x?

    Merci

  6. #6
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    bonjour

    c'est la condition de sélection ;
    c'est comme si tu fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    foreach(Node x in root.Nodes())
    {}
    X a la même signification dans les deux cas .

  7. #7
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Citation Envoyé par rj450 Voir le message
    Merci Guruumeditation

    J'ai été en congé deux semaines, désolé.

    Juste une question sur ton code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var xml = String.Concat(root.Nodes().Select(x => x.ToString()).ToArray());
    Que représente x?

    Merci
    J'étais aussi en congé 2 semaines (enfin une semaine + une semaine au Build).

    Select demande une fonction (ou lambda expression, dans mon cas) qui a comme entrée le type de la collection (dans ce cas XNode, vu que node est un IEnumerable<XNode>) et un type quelconque en sortie.

    Dans la lambda expression, ce qui est avant le "=>" est le nom des variables d'entrées (Dans le cas ici, il n'y en a qu'une, de type XNode). Je l'appelle x, mais je pourrais utiliser n'importe quel nom de variable valide.

    x est donc de type XNode.

Discussions similaires

  1. Réponses: 7
    Dernier message: 09/01/2019, 21h23
  2. valider un xml en fonction du xsd
    Par gentil dans le forum C#
    Réponses: 9
    Dernier message: 24/02/2008, 14h11
  3. [XSD] Validation d'un XML en fonction d'attributs
    Par Oliveuh dans le forum Valider
    Réponses: 2
    Dernier message: 04/06/2007, 12h25
  4. Programme de modification de XML en fonction de conditions
    Par greg2 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 31/07/2006, 08h20

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