2013-05-04 5 views
0

Le code suivant crée un fichier XML physique appelé employees.xml. Mais je ne veux pas créer un fichier physique. Au lieu de cela, je veux enregistrer le contenu XML dans une variable. Comment puis-je modifier le code suivant pour enregistrer les données XML dans une variable et ne pas l'avoir physiquement créé?Enregistrer le contenu XML dans une variable

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

Répondre

3

Vous pouvez écrire à MemoryStream et utiliser

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

code Vous serait modifié comme

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

Vous pouvez sélectionner le codage dont vous avez besoin. Juste une petite modification dans votre code donnera la sortie désirée

+0

Ainsi, le code restant sera le même? –

+0

J'ai mis à jour ma réponse, avec un code complet. – Adil

1

Vous pouvez utiliser la classe StringWriter et le XML final sera sauvegardé dans la variable 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

Plutôt que d'utiliser XmlWriter, je voudrais créer un objet DOM en mémoire - idéalement avec LINQ pour XML, ce qui vous permet d'exprimer la chose comme une requête:

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

Vous pouvez maintenant manipuler ce XML (en ajoutant ou supprimant des éléments etc) et quand vous voulez l'enregistrer dans un fichier (ou le diffuser sur le réseau ou autre chose, vous pouvez le faire facilement).

Si vous voulez que la représentation de chaîne dans une variable, vous pouvez simplement utiliser ToString:

var xmlAsText = xml.ToString(); 
1

Je vais rester avec la même solution de @Adil. Mais vous souhaitez ajouter des modifications à votre code:

Au lieu d'écrire un objet XML manuellement (tous les membres de la classe), vous pouvez utiliser une classe XmlSerializer. Avec cette classe, vous pouvez alors Deserialize objet xml retour à l'instance de classe

deuxième - si vous voulez conserver les données de Employees dans l'objet xml et peut-être plus tard pour changer quelque chose là-dedans, que vous pouvez utiliser un XmlDocument. Voici le code:

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. Pour que la sérialisation fonctionne correctement, les deux classes Employees et Employee doivent avoir un constructeur par défaut (sans paramètres) et les propriétés que vous voulez convertir en XML doivent être publiques.

Ce quel genre de classes I utilisé pour le test:

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; 
    } 
} 
Questions connexes