3

C# の XmlSerializer を使用して xml ファイルにシリアル化するオブジェクトのリストに加えて、さらにいくつかの独立した要素 (主にテキスト ボックスからの文字列) を同じ xml に格納したいと考えています。

    public static void SaveBehaviors(ObservableCollection<Param> listParams)
    {
        XmlSerializer _paramsSerializer = new XmlSerializer(listParams.GetType());
        string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
        path += "\\test.xml";
        using (TextWriter writeFileStream = new StreamWriter(path))
        {
            _paramsSerializer.Serialize(writeFileStream, listParams);

            using (XmlWriter writer = XmlWriter.Create(writeFileStream))
            {
                writer.WriteStartElement("Foo"); //test entry...
                writer.WriteAttributeString("Bar", "Some & value");
                writer.WriteElementString("Nested", "data");
                writer.WriteEndElement();
            }
        }
    }

ただし、「test.xml」をデシリアライズすると、要素が追加されているためエラーになります。シリアライズされたxmlファイルへの書き込みは禁止されており、避けるべきではないでしょうか?

4

3 に答える 3

2

いいえ、そうしないでください。

ObservableCollection 以外をシリアル化する必要がある場合は、包含型を定義し、それをシリアル化します。

public static void SaveBehaviors(ObservableCollection<Param> listParams) 
{ 
    XmlSerializer _paramsSerializer = new XmlSerializer(typeof(ContainingType)); 
    var c = new ContainingType(listParams); 
    c.ExtraInformation = whatever....; 

    string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
    path += "\\test.xml"; 
    using (TextWriter writeFileStream = new StreamWriter(path)) 
    { 
        _paramsSerializer.Serialize(writeFileStream, c); 
    } 
} 

XmlSerializer を使用します。

于 2012-06-04T16:40:10.513 に答える
0

実行できますが、ストリームを使用しないことを強くお勧めします。ライターでストリームを再度開くと (シリアライザーは終了時にストリームを閉じます)、その間の最初から開始します。これが、MalFormed xml を取得している理由です。

できることは、ストリームを XmlDocument に再ロードすることです。これは、あなたにとってよりうまくいくかもしれない編集された機能です。

public static void SaveBehaviors(ObservableCollection<Param> listParams)
{
    XmlSerializer _paramsSerializer = new XmlSerializer(listParams.GetType());
    string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    path += "\\test.xml";
    using (TextWriter writeFileStream = new StreamWriter(path))
    {
        _paramsSerializer.Serialize(writeFileStream, listParams);

        using (XmlDocument doc = new XmlDocument())
        {
            doc.Load(path);//load from the saved document
            XmlNode fooNode = doc.CreateElement("foo");//create node
            XmlAttribute fooAtt = doc.CreateAttribute("bar");//create attribute
            fooAtt.InnerText = "some att data";//set data
            fooNode.InnerText = "some node text";//set data
            fooNode.Attributes.Append(fooAtt);//add attribute to node
            doc.DocumentElement.AppendChild(fooNode);//add node to document
            doc.Save(path);//save the changes made
        }
    }
}

これには XmlWriter を使用できますが、危険なのは、WriteStream がデータを正しい場所に配置していることを確認することです。現時点では、これを行うために XmlWriter について十分に知りません。かなりの実験と出力ファイルの確認が必要です。XmlDocument が提供する組み込みの書式設定を使用する方がはるかに簡単です。

于 2012-06-04T16:37:00.250 に答える
0

禁止されているわけではありません。複数のルート タグを含む違法な xml ファイルを作成しているだけです。シリアル化されたオブジェクトを書き込む前に、最初の要素タグを書き出す必要があります。カスタム要素を書き出したら、そのタグを閉じます。使用したコード パターンでは、このタグと終了タグを手動で記述する必要があります

于 2012-06-04T16:40:43.987 に答える