2010-11-19 155 views
1

我是C#的新手。我现在正在上课,我们的一个例子不会编译。 Visual Studio 2010给我这个错误:XML文档中有错误(3,2)。C#XML序列化/反序列化

如何编辑XML文件以使其与代码一起工作?

谢谢你的帮助!

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(); 
    } 
} 

using System; namespace XmlArraySerialize { /// /// XmlArraySerialize示例:序列化和反序列化/// 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; 

    } 
} 

}

和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

你能否也发布“Person”类的代码?此外,你提到它是编译错误,但我不认为VS会打扰你的XML文件,你把XML文件放在哪里?它不应该包含在VS项目中(至少不需要编译)。 – xandy 2010-11-19 00:23:11

+0

好的,编辑后包含Person类。 XML文件位于/ bin/debug文件夹中。 – 2010-11-19 00:31:52

+0

http://stackoverflow.com/questions/10109608/c-sharp-deserialize-xml-to-object-there-is-an-error-in-xml-document-3-2/15620946#15620946 这篇文章有解决方案。 – Savaratkar 2013-03-25 17:26:22

回答

2

这应该工作)

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 XmlTypeMore about XmlAttribute

+0

嗨,谢谢你的回应!我想知道是否有一种方法来简单地编辑XML文件,以便它能正确加载? – 2010-11-19 00:27:47

+0

@Taj G,我没有看到任何简单的方法来编辑XML来加载它。您的代码没有提及任何名为Persons的人,这是您获取运行时错误的地方。之后,您的代码对XML文件中的ID属性没有任何作用。您需要更改一些代码才能使其正常工作。 – Jason 2010-11-19 01:00:57

0

感谢您的意见!我已经解决了这个问题。由于代码中没有主要方法,因此我必须编辑属性,以便SerializeOut在SerializeIn之前工作。我猜Persons XML文件只是一个模板...再次感谢!