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

@Adil と同じソリューションを使用します。ただし、コードに変更を加えたい場合:

手動で xml オブジェクト (クラスのすべてのメンバー) を記述する代わりに、XmlSerializerクラスを使用できます。このクラスを使用すると、Deserializexml オブジェクトをクラス インスタンスに戻すことができます。

Employees第 2 - 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シリアライゼーションの場合、従業員と従業員の両方のクラスが正常に機能するために、デフォルトのコンストラクター(パラメーターなし)が必要であり、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 に答える
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 に答える
0

ストリームを使用する代わりに、StringBuilder インスタンスに書き込むことができます: XmlWriter.Create-Methode (StringBuilder)

于 2013-05-04T08:55:31.673 に答える