2010-11-19 9 views
1

Je suis tout nouveau à C#. Je suis en train de prendre un cours là-dessus, et un de nos exemples de classe ne compilera pas. Visual Studio 2010 me donne cette erreur: Il existe une erreur dans le document XML (3, 2).C# XML Serialization/Deserialization

Comment modifier le fichier XML pour qu'il fonctionne avec le code?

Nous vous remercions de votre aide!

public class SerializeIn 
{ 
    public static void Main() 
    { 
     // Declarations. 
     Person[] p = new Person[0]; 
     string infile = "Persons.xml"; 
     StreamReader sr = new StreamReader(infile); 
     XmlSerializer xs = new XmlSerializer(p.GetType()); 

     // Deserialize Person object from disc. 
     p = (Person[])(xs.Deserialize(sr)); 

     // Close StreamReader object to be safe. 
     sr.Close(); 

     // Write what happened. 
     Console.WriteLine("Deserialized array p from output file " + 
      infile + "."); 

     // Print array. 
     foreach(Person x in p) 
      Console.WriteLine(x); 

     Console.ReadLine(); 
    } 
} 

en utilisant System; namespace XmlArraySerialize { /// /// XmlArraySerialize Exemple: Sérialise et désérialise /// un tableau de Person. ///

public class Person 
{ 
    public string name; 
    public string gender; 
    public int age; 

    // Noarg constructor needed for compatibility 
    public Person() { } 

    public Person(string theName, string theGender, int theAge) 
    { 
     name = theName; 
     gender = theGender; 
     age = theAge; 
    } 

    public override string ToString() 
    { 
     return name + " " + gender + " " + age; 

    } 
} 

}

Et le fichier XML ...

<?xml version="1.0" standalone="no"?> 
<!--Created by ToXml Example in IO--> 
<Persons> 
    <Person ID="1001"> 
     <Name>Susan</Name> 
     <Gender>F</Gender> 
     <Age>21</Age> 
    </Person> 
    <Person ID="1002"> 
     <Name>Michael</Name> 
     <Gender>M</Gender> 
     <Age>25</Age> 
    </Person> 
    <Person ID="1003"> 
     <Name>Judy</Name> 
     <Gender>F</Gender> 
     <Age>31</Age> 
    </Person> 
    <Person ID="1004"> 
     <Name>Chloe</Name> 
     <Gender>F</Gender> 
     <Age>27</Age> 
    </Person> 
    <Person ID="1005"> 
     <Name>Scott</Name> 
     <Gender>M</Gender> 
     <Age>58</Age> 
    </Person> 
    <Person ID="1006"> 
     <Name>William</Name> 
     <Gender>M</Gender> 
     <Age>41</Age> 
    </Person> 
    <Person ID="1007"> 
     <Name>Mary</Name> 
     <Gender>F</Gender> 
     <Age>30</Age> 
    </Person> 
</Persons> 
+0

De plus, vous mentionnez que c'est une erreur de compilation, mais je ne pense pas que VS dérangera votre fichier XML, où vous mettez le fichier XML? Il ne devrait pas être inclus dans le projet VS (du moins pas besoin de compiler). – xandy

+0

OK, modifié pour inclure la classe Person. Le fichier XML est juste dans le dossier/bin/debug. –

+0

http://stackoverflow.com/questions/10109608/c-sharp-deserialize-xml-to-object-there-is-an-error-in-xml-document-3-2/15620946#15620946 Ce message a la solution. – Savaratkar

Répondre

2

Cela devrait fonctionner)

class Program 
{ 
    static void Main(string[] args) 
    { 
     const string infile = "x:\\Persons.xml"; 
     Persons p; 

     using (var sr = new StreamReader(infile)) 
     { 
      var xs = new XmlSerializer(p.GetType()); 
      p = (Persons)(xs.Deserialize(sr)); 
     } 

     Console.WriteLine("Deserialized array p from output file " + infile + "."); 

     // Print array. 
     foreach (var x in p) 
      Console.WriteLine(x); 

     Console.ReadLine(); 
    } 
} 

[XmlType(TypeName = "Persons")] 
public class Persons : IEnumerable<Person> 
{ 
    private List<Person> inner = new List<Person>(); 

    public void Add(object o) 
    { 
     inner.Add((Person)o); 
    } 

    public IEnumerator<Person> GetEnumerator() 
    { 
     return inner.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 


public class Person 
{ 
    [XmlAttribute] 
    public int ID { get; set; } 

    public string Name { get; set; } 
    public string Gender { get; set; } 
    public int Age { get; set; } 
} 

More about XmlType, More about XmlAttribute

+0

Salut, merci pour la réponse! Je me demande s'il existe un moyen de modifier simplement le fichier XML pour qu'il se charge correctement? –

+0

@Taj G, je ne vois pas de moyen facile d'éditer le XML pour le charger. Votre code n'a aucune référence à quelque chose nommé Personnes, qui est l'endroit où vous obtenez votre erreur d'exécution. Après cela, votre code n'a rien pour l'attribut ID dans le fichier XML. Vous avez besoin de quelques modifications de code pour le faire fonctionner. – Jason

0

Merci pour votre contribution! J'ai résolu le problème. Comme il n'y a pas de méthode principale dans le code, j'ai dû éditer les propriétés pour que SerializeOut fonctionne avant SerializeIn. Je suppose que le fichier XML de personnes est juste un modèle ... Merci encore! Pouvez-vous afficher aussi le code pour la classe "Personne"?