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

XNA/Monogame Discussion :

Erreur compilation fichier xml sur chargement d'une list via content


Sujet :

XNA/Monogame

  1. #1
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut Erreur compilation fichier xml sur chargement d'une list via content
    Bonjour,

    je cherche à m'amuser avec les content de XNA.
    Je souhaite manipuler des fichiers XML décrivant des discussions.

    ma classe Discussion :
    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
    public class Discussion
        {
            private List<Dialogue> dialogues = new List<Dialogue>();
            private String idDiscussion = null;
            private String idInitiateurDiscussion = null;
     
            public List<Dialogue> Dialogues
            {
                get { return dialogues; }
                set { dialogues = value; }
            }
     
            public String IdInitiateurDiscussion
            {
                get { return idInitiateurDiscussion; }
                set { idInitiateurDiscussion = value; }
            }
     
            public String IdDiscussion
            {
                get { return idDiscussion; }
                set { idDiscussion = value; }
            }
    ...
    }
    ma classe Dialogue qui compose Discussion :
    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
        public class Dialogue
        {
            private String idDialogue = null;
            private String texteEnonce = null;
            private String idParleur = null;
            private String idDialogueParent = null;
     
            public String TexteEnonce
            {
                get { return texteEnonce; }
                set { texteEnonce = value; }
            }
     
            public String IdDialogueParent
            {
                get { return idDialogueParent; }
                set { idDialogueParent = value; }
            }
     
            public String IdParleur
            {
                get { return idParleur; }
                set { idParleur = value; }
            }
     
            public String IdDialogue
            {
                get { return idDialogue; }
                set { idDialogue = value; }
            }
    ...
    }
    Mon Reader:
    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
        public class DiscussionContentReader : ContentTypeReader<Discussion>
        {
            protected override Discussion Read(ContentReader input, Discussion existingInstance)
            {
                Discussion dis = new Discussion();
     
                dis.IdDiscussion = input.ReadString();
                dis.IdInitiateurDiscussion = input.ReadString();
                dis.Dialogues = input.ReadObject<List<Dialogue>>();
     
                return dis;
            }
        }
     
     
        public class DialogueContentReader : ContentTypeReader<Dialogue>
        {
            protected override Dialogue Read(ContentReader input, Dialogue existingInstance)
            {
                Dialogue d = new Dialogue();
     
                d.IdDialogue = input.ReadString();
                d.IdDialogueParent = input.ReadString();
                d.TexteEnonce = input.ReadString();
                d.IdParleur = input.ReadString();
     
                return d;
            }
        }
    Mon Writer:
    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
        [ContentTypeWriter]
        public class DiscussionContentWriter : ContentTypeWriter<Discussion>
        {
            protected override void Write(ContentWriter output, Discussion value)
            {
                output.Write(value.IdDiscussion);
                output.Write(value.IdInitiateurDiscussion);
                output.WriteObject<List<Dialogue>>(value.Dialogues);
            }
     
            public override string GetRuntimeReader(TargetPlatform targetPlatform)
            {
                return typeof(DiscussionContentReader).AssemblyQualifiedName;
            }
        }
     
        [ContentTypeWriter]
        public class DialogueContentWriter : ContentTypeWriter<Dialogue>
        {
            protected override void Write(ContentWriter output, Dialogue value)
            {
                output.Write(value.IdDialogue);
                output.Write(value.IdDialogueParent);
                output.Write(value.TexteEnonce);
                output.Write(value.IdParleur);
            }
     
            public override string GetRuntimeReader(TargetPlatform targetPlatform)
            {
                return typeof(DialogueContentWriter).AssemblyQualifiedName;
            }
        }
    XML créé à la mano:
    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
    <?xml version="1.0" encoding="utf-8" ?>
    <XnaContent>
      <Asset Type="GestionMap.Discussion">
    	  <IdDiscussion>Dis1</IdDiscussion>
    	  <IdInitiateurDiscussion>hyppo</IdInitiateurDiscussion>
    	  <Dialogues Type="System.Collections.Generic.List[GestionMap.Dialogue]">
    		  <Item>
    			  <IdDialogue>dial1</IdDialogue>
    			  <IdDialogueParent />
    			  <TexteEnonce>Bonjour!</TexteEnonce>
    			  <IdParleur>hyppo</IdParleur>
    		  </Item>
    		  <Item>
    			  <IdDialogue>dial2</IdDialogue>
    			  <IdDialogueParent>dial1</IdDialogueParent>
    			  <TexteEnonce>Hé les gars, regardez ce que j'ai trouvé</TexteEnonce>
    			  <IdParleur>explo1</IdParleur>
    		  </Item>
    	  </Dialogues>
      </Asset>
    </XnaContent>
    Mon erreur:
    Erreur XML element "Dialogues" not found in DiscussionDebut.xml
    Je ne comprends pas pourquoi je me fais jeter, pouvez-vous m'aider ? Ai-je tort d'essayer de définir un élément comme liste qu'i n'est pas l'élément racine ?

    Merci

  2. #2
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    Essaye de remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <Dialogues Type="System.Collections.Generic.List[GestionMap.Dialogue]">
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <Asset Type="System.Collections.Generic.List[GestionMap.Dialogue]">
    Sinon tu peux toujours créer un objet Discussion puis Dialogue et essayer de les écrire dans un fichier XML avec ton Writer. Tu verras de suite si c'est ton fichier XML qui déconne

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Je vais tenter la solution B, j'aimerais bien garder les propriétés de Discussion

    Merci pour la réponse, je teste ça demain

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Finalement je n'ai pas tenu.

    Avec un petit jeu de test :

    Résultat de l'écriture dans le 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
    <?xml version="1.0" encoding="utf-8"?>
    <XnaContent>
      <Asset Type="GestionMap.Discussion">
        <Dialogues>
          <Item>
            <TexteEnonce>Hello</TexteEnonce>
            <IdDialogueParent Null="true" />
            <IdParleur>Azatoth</IdParleur>
            <IdDialogue>dial1</IdDialogue>
          </Item>
          <Item>
            <TexteEnonce>Bouh</TexteEnonce>
            <IdDialogueParent>dial1</IdDialogueParent>
            <IdParleur>Chercheur</IdParleur>
            <IdDialogue>dial2</IdDialogue>
          </Item>
        </Dialogues>
        <IdInitiateurDiscussion>Azatoth</IdInitiateurDiscussion>
        <IdDiscussion>dis1</IdDiscussion>
      </Asset>
    </XnaContent>
    Le résultat est le même, sauf que l'ordre est différent.

    J'attire l'attention sur le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <IdDialogueParent Null="true" />
    Qui me provoque une une exception ArgumentNullException.

    J'ai tenté de tagger la propriété que je pense concernée de cette manière, sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [ContentSerializer(AllowNull=true)]
            public String IdDialogueParent
            {
                get { return idDialogueParent; }
                set { idDialogueParent = value; }
            }
    Si on enlève le Null="True", ça compile, mais je ne suis pas sûr de récupérer ma valeur Null à l'exploitation, il va falloir que je teste ça.

    Petit test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Discussion d = Content.Load<Discussion>(@"Discussions/Discussion1");
    Exception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Impossible d'effectuer un cast d'un objet de type 'GestionMapExtension.DialogueContentWriter' en type 'Microsoft.Xna.Framework.Content.ContentTypeReader'."
    J'accuse la fatigue donc je m'arrête là pour ce soir, si vous avez des billes pour m'aider ce serait royal.

    Et peut-on m'expliquer pourquoi il est aussi prise de tête sur l'ordre des éléments ?

    Merci

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Ai trouvé l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public override string GetRuntimeReader(TargetPlatform targetPlatform)
            {
                return typeof(DialogueContentWriter).AssemblyQualifiedName;
            }
    Devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public override string GetRuntimeReader(TargetPlatform targetPlatform)
            {
                return typeof(DialogueContentReader).AssemblyQualifiedName;
            }
    Je peine encore à définir des valeurs nulles pour les chaines de caractères, sinon c'est OK. (ah et pourquoi il m'impose son ordre de lecture du xlml ? oO)

    Merci

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/12/2009, 20h05
  2. [DOM] Afficher les elements d'un fichier xml sur une interface
    Par Viscapon dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 07/05/2008, 22h40
  3. Syntaxe sur chargement d'une liste déroulante
    Par Trebor_ dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2008, 05h17
  4. affichage d'un fichier xml sur une page
    Par witch dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/10/2007, 19h27
  5. Lancement d'un fichier sur chargement d'une page
    Par Mut dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 04/07/2007, 15h03

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