2013-05-04 85 views
0

以下代碼將創建一個名爲employees.xml的物理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

所以剩下的代碼是一樣的? – 2013-05-04 06:15:56

+0

我已經用完整的代碼更新了我的答案。 – Adil 2013-05-04 06:24:57

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對象返回類的實例

二 - 如果你想保持XML對象的Employees數據,也許後來改變了什麼事,比你可以使用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.對於序列化工作正常,員工和員工都必須具有默認構造函數(不帶參數),並且您希望xml的屬性必須是公共的。

這是什麼樣的課我用於測試:

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