2009-10-06 1 views
3

Я использую файл как следующий для хранения данных:Как использовать XML для хранения простого объекта (C#)

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

Каждая строка преобразуется в строки (имя, Pass, электронная почта)

Я хотел бы получить мой текстовый файл (см выше), преобразованный в файл XML, например:

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

<person2> 
etc etc etc etc 

в основном, я застрял на том, как сделать эту миграцию, а также манипулировать данными XML так же, как и с текстом данные

+0

Обратите внимание, что использование элементов для описания позиции («person1», «person2») - очень плохая идея ... атрибут будет намного лучше. –

ответ

7

Ответный ответ на ваш вопрос таков:

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

Вы можете взглянуть на это XML Serialization tutorial. Сериализация может сэкономить вам много усилий по загрузке и сохранению XML-файла.

1

Linq обеспечивает хороший способ построения XML с помощью XNodes:

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

Меняющиеся названия элементов (плохая идея) делают это сложным –

+0

Я полагаю. Ну, надеюсь, что это будет разрешено, когда OP перейдет на стандартный механизм сериализации! – bobbymcr

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, но +1 для приятного приятного LINQ для читателя! – MarcE

Смежные вопросы