2013-05-04 5 views
0

Следующий код создает физический XML-файл с именем employees.xml. Но я не хочу создавать физический файл. Вместо этого я хочу сохранить содержимое XML в переменной. Как я могу изменить следующий код, чтобы сохранить XML-данные в переменную и не создать ее физически?Сохраните содержимое XML в переменной

using (XmlWriter writer = XmlWriter.Create("employees.xml")) 
{ 
    writer.WriteStartDocument(); 
    writer.WriteStartElement("Employees"); 

    foreach (Employee employee in employees) 
    { 
     writer.WriteStartElement("Employee"); 

     writer.WriteElementString("ID", employee.Id.ToString()); 
     writer.WriteElementString("FirstName", employee.FirstName); 
     writer.WriteElementString("LastName", employee.LastName); 
     writer.WriteElementString("Salary", employee.Salary.ToString()); 

     writer.WriteEndElement(); 
    } 

    writer.WriteEndElement(); 
    writer.WriteEndDocument(); 
} 

ответ

3

Вы можете написать MemoryStream и использовать

var stream = new MemoryStream(); 
var writer = XmlWriter.Create(stream); 

вас код будет изменен, как

var stream = new MemoryStream();  
using (XmlWriter writer = XmlWriter.Create(stream)) 
{ 
    writer.WriteStartDocument(); 
    writer.WriteStartElement("Employees"); 

    foreach (Employee employee in employees) 
    { 
     writer.WriteStartElement("Employee"); 
     writer.WriteElementString("Id", employee.Id.ToString()); 
     writer.WriteElementString("FirstName", employee.FirstName); 
     writer.WriteElementString("LastName", employee.LastName); 
     writer.WriteElementString("Salary", employee.Salary); 
     writer.WriteEndElement(); 
    } 

    writer.WriteEndElement(); 
    writer.WriteEndDocument(); 
} 
string strXml = System.Text.ASCIIEncoding.UTF8.GetString(stream.ToArray()) 

Вы можете выбрать кодировку вам нужно.

+0

Так оставшийся код будет таким же? –

+0

Я обновил свой ответ, с полным кодом. – Adil

1

Просто небольшая модификация в коде даст желаемый результат. Вы можете использовать класс StringWriter, и окончательный XML будет сохранен внутри переменной xmlString.

string xmlString = null; 
using (StringWriter sw = new StringWriter()) 
{ 
    XmlTextWriter writer = new XmlTextWriter(sw); 
    writer.Formatting = Formatting.Indented; // if you want it indented 

    writer.WriteStartDocument(); 
    writer.WriteStartElement("Employees"); 

    foreach (Employee employee in employees) 
    { 
     writer.WriteStartElement("Employee"); 

     writer.WriteElementString("ID", employee.Id.ToString()); 
     writer.WriteElementString("FirstName", employee.FirstName); 
     writer.WriteElementString("LastName", employee.LastName); 
     writer.WriteElementString("Salary", employee.Salary.ToString()); 

     writer.WriteEndElement(); 
    } 

    writer.WriteEndElement(); 
    writer.WriteEndDocument(); 

    xmlString = sw.ToString(); 
} 
1

Вместо того чтобы использовать XmlWriter, я хотел бы создать объект DOM в памяти - в идеале с помощью LINQ к XML, который позволит вам выразить все это как запрос:

var xml = new XDocument(new XElement("Employees"), 
    employees.Select(e => new XElement("Employee", 
     new XElement("ID", e.Id), 
     new XElement("FirstName", employee.FirstName), 
     new XElement("LastName", employee.LastName), 
     new XElement("Salary", employee.Salary)))); 

Теперь вы можете управлять этот XML (добавление или удаление элементов и т. д.), и если вы хотите сохранить его в файл (или передать его по сети или что-то еще, вы можете сделать это легко).

Если вы хотите строку представление в переменной, вы можете просто использовать ToString:

var xmlAsText = xml.ToString(); 
1

Я буду оставаться с таким же решением от @Adil. Но хотите добавить изменения в свой код:

Вместо того чтобы писать объект xml вручную (каждый член класса), вы можете использовать класс XmlSerializer. С помощью этого класса можно затем Deserialize XML объект обратно экземпляра класса

Второй - если вы хотите сохранить данные Employees в объекте XML и может быть позже, чтобы изменить что-то там, чем вы можете использовать XmlDocument. Здесь код:

XmlSerializer _xSerialize = new XmlSerializer(_employees.GetType()); 
MemoryStream _mstream = new MemoryStream(); 

using (XmlWriter writer = XmlWriter.Create(_mstream)) 
{ 
    _xSerialize.Serialize(_mstream, _workers); 
} 

XmlDocument document = new XmlDocument(); 
document.Load(_mstream); 

P.S. Для Сериализации, работающей отлично, оба класса Сотрудники и Сотрудники должны иметь конструктор по умолчанию (без параметров), а свойства, которые вы хотите использовать, должны быть общедоступными.

Это какие классы я использовал для тестирования:

public class Employees 
{ 
    public List<Employee> Workers { get; set; } 

    public Employees() 
    { 
     this.Workers = new List<Employee>(); 
    } 
} 

public class Employee 
{ 
    public Int32 ID{ get; set; } 
    public string FirstName{ get; set; } 
    public string LastName{ get; set; } 
    public float Salary{ get; set; } 

    public Employee() { } 

    public Employee(Int32 id, string fname, string lname, float salary) 
    { 
     this.ID = id; 
     this.FirstName = fname; 
     this.LastName = lname; 
     this.Salary = salary; 
    } 
} 
Смежные вопросы