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 回答