2009-10-06 71 views
3

我一直在使用一個文件類似下面的保存數據:如何使用XML來存儲一個簡單的對象(C#)

field1 field2 field3 field4 
myname myhashedpass [email protected] more stuff after 
etc etc etc etc 

每一行被轉換成字符串(姓名,通行證,電子郵件)

我想獲得我的文本文件(見上文)轉換成XML文件,像這樣:

<person1> 
    <name>myname</name> 
    <pass>myhashedpass</pass> 
    <email>etc</email> 
</person1> 

<person2> 
etc etc etc etc 

基本上,我卡在如何做到這一點的遷移,也操作XML數據就像我對文本所做的一樣數據

+0

請注意,使用元素來描述位置(「person1」,「person2」)是一個非常糟糕的主意......屬性會好得多。 – 2009-10-06 05:16:52

回答

7

針對您的問題的litteral回答是這樣的:

using System; 
using System.Linq; 
using System.Xml.Linq; 

namespace XmlSerialization 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var person1 = new Person(); 
      person1.Name = "Joe"; 
      person1.Password = "Cla$$ified"; 
      person1.Email = "[email protected]"; 

      var person2 = new Person(); 
      person2.Name = "Doe"; 
      person2.Name = "$ecret"; 
      person2.Email = "[email protected]"; 

      var persons = new[] {person1, person2}; 

      XElement xml = new XElement("persons", 
             from person in persons 
             select new XElement("person", 
                  new XElement("name", person.Name), 
                  new XElement("password", person.Password), 
                  new XElement("email", person.Email)) 
             ); 
      xml.Save("persons.xml"); 

      XElement restored_xml = XElement.Load("persons.xml"); 
      Person[] restored_persons = (from person in restored_xml.Elements("person") 
             select new Person 
                { 
                 Name = (string)person.Element("name"), 
                 Password = (string)person.Element("password"), 
                 Email = (string)person.Element("email") 
                }) 
             .ToArray(); 
      foreach (var person in restored_persons) 
      { 
       Console.WriteLine(person.ToString()); 
      } 
      Console.ReadLine(); 
    } 
} 

public class Person 
{ 
    public string Name { get; set; } 
    public string Password { get; set; } 
    public string Email { get; set; } 
    public override string ToString() 
    { 
     return string.Format("The person with name {0} has password {1} and email {2}", 
          this.Name, this.Password, this.Email); 
    } 
} 

}

但是,更好的讓內置serializattion類做翻譯和XML爲您服務。下面的代碼需要顯式引用System.Runtime.Serialization.dll。使用聲明本身是不夠的:

using System; 
using System.IO; 
using System.Linq; 
using System.Xml.Linq; 
using System.Runtime.Serialization; 

namespace XmlSerialization 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var person1 = new Person(); 
      person1.Name = "Joe"; 
      person1.Password = "Cla$$ified"; 
      person1.Email = "[email protected]"; 

      var person2 = new Person(); 
      person2.Name = "Doe"; 
      person2.Name = "$ecret"; 
      person2.Email = "[email protected]"; 

      var persons = new[] {person1, person2}; 

      DataContractSerializer serializer=new DataContractSerializer(typeof(Person[])); 
      using (var stream = new FileStream("persons.xml", FileMode.Create, FileAccess.Write)) 
      { 
       serializer.WriteObject(stream,persons); 
      } 

      Person[] restored_persons; 
      using (var another_stream=new FileStream("persons.xml",FileMode.Open,FileAccess.Read)) 
      { 
       restored_persons = serializer.ReadObject(another_stream) as Person[]; 
      } 

      foreach (var person in restored_persons) 
      { 
       Console.WriteLine(person.ToString()); 
      } 
      Console.ReadLine(); 
     } 
    } 

    [DataContract] 
    public class Person 
    { 
     [DataMember] 
     public string Name { get; set; } 
     [DataMember] 
     public string Password { get; set; } 
     [DataMember] 
     public string Email { get; set; } 
     public override string ToString() 
     { 
      return string.Format("The person with name {0} has password {1} and email {2}", 
           this.Name, this.Password, this.Email); 
     } 
    } 
} 
1

LINQ的使用XNodes提供了一個很好的方式來構造XML:

from p in person 
    select new XElement("person", 
    from s in p.Keys 
     select new XElement(s, p[s])); 

容易蛋糕。

1

從你的問題中不完全清楚,但它聽起來像你正在序列化一個Person類到一個文本文件。這可能是的完美用例。

示例代碼:

class Person 
{ 
    // XmlSerializer requires parameterless constructor 
    public Person() 
    { 
    } 

    public string Name { get; set; } 

    public string Pass { get; set; } 

    public string Email { get; set; } 

    public string Host { get; set; } 
} 

// ... 

XmlSerializer serializer = new XmlSerializer(typeof(Person)); 

// Write a person to an XML file 
Person person = new Person() { Name = "N", Pass = "P", Email = "E", Host = "H" }; 
using (XmlWriter writer = XmlWriter.Create("person.xml")) 
{ 
    serializer.Serialize(writer); 
} 

// Read a person from an XML file 
using (XmlReader reader = XmlReader.Create("person.xml")) 
{ 
    person = (Person)serializer.Deserialize(reader); 
} 
+0

不斷變化的元素名稱(一個不好的主意)使我想這個棘手的 – 2009-10-06 05:16:20

+0

。那麼,希望當OP轉向標準的序列化機制時就能解決這個問題! – bobbymcr 2009-10-06 05:59:16

4

所以要讀出原始文件,你有這樣的:通過

var people = File.ReadAllLines("filename")) 
    .Select(line => { 
     var parts = line.Split(); 
     return new Person { 
      Name = parts[0], 
      Password = parts[1], 
      Email = parts[2] 
     }); 

,那麼你可以寫出來的xml:

var serializer = new XmlSerializer(typeof(Person)); 
var xmlfile = File.OpenWrite("somefile"); 
foreach(var person in people) 
    serializer.Serialize(person, xmlfile); 
+0

*完全*回答OP的問題,因爲它不會寫出指定的確切XML格式,而是在閱讀器上使用LINQ的+1! – MarcE 2009-10-06 12:52:13

相關問題