0

以下代码创建一个名为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();
}
4

5 回答 5

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

您可以选择所需的编码。

于 2013-05-04T05:53:56.000 回答
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();
}
于 2013-05-04T06:19:18.893 回答
1

我不会使用 XmlWriter,而是在内存中创建一个 DOM 对象——理想情况下使用 LINQ to 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();
于 2013-05-04T06:47:30.810 回答
1

我将继续使用@Adil 的相同解决方案。但是想在您的代码中添加更改:

您可以使用一个类,而不是手动编写一个 xml 对象(类的每个成员)XmlSerializer。使用此类,您可以将Deserializexml 对象返回到类实例

其次 - 如果您想将数据保留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);

PS 对于序列化工作正常,Employees 和 Employee 类都必须具有默认构造函数(没有参数),并且您想要 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;
    }
}
于 2013-05-04T08:18:02.240 回答
0

您可以写入 StringBuilder 实例,而不是使用某些流:XmlWriter.Create-Methode (StringBuilder)

于 2013-05-04T08:55:31.673 回答