2010-11-19 167 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文件只是一個模板...再次感謝!