我正在使用一个类库,它用.xml表示它的一些配置。使用XmlSerializer读取配置。幸运的是,表示.xml的类使用XmlAnyElement属性,在该属性处,我可以扩展配置数据以达到自己的目的,而无需修改原始类库。

<?xml version="1.0" encoding="utf-8"?>
<Config>
  <data>This is some data</data>
  <MyConfig>
    <data>This is my data</data>
  </MyConfig>
</Config>

这对于反序列化很有效。我可以允许类库反序列化.xml作为常态,并且我可以使用我自己的XmlSerializer实例,用一个XmlNodeReader反对内部XmlNode
public class Config
{
    [XmlElement]
    public string data;

    [XmlAnyElement]
    public XmlNode element;
}

public class MyConfig
{
    [XmlElement]
    public string data;
}

class Program
{
    static void Main(string[] args)
    {
        using (Stream fs = new FileStream(@"c:\temp\xmltest.xml", FileMode.Open))
        {
            XmlSerializer xser1 = new XmlSerializer(typeof(Config));
            Config config = (Config)xser1.Deserialize(fs);

            if (config.element != null)
            {
                XmlSerializer xser2 = new XmlSerializer(typeof(MyConfig));
                MyConfig myConfig = (MyConfig)xser2.Deserialize(new XmlNodeReader(config.element));
            }
        }
    }

我需要创建一个实用程序,该实用程序允许用户生成一个新的配置文件,其中既包括类库配置,也包括我自己的配置,因此将创建未从.xml文件中读取的新对象。问题是如何将数据序列化为.xml?
我意识到,在对类库配置调用同一方法之前,必须先对数据调用XmlSerializer.Serialize。但是,这需要在调用XmlNode之后用Serialize表示我的数据。使用XmlNode将对象序列化为XmlSerializer的最佳方法是什么?
谢谢,
-凯文
顺便说一下,它看起来像是由Chris Lovett编写的XmlNodeWriter类,一次可以从微软获得,但是链接现在被打破了。有人知道这个班的另一个上课地点吗?

最佳答案

因此,您需要让类包含自定义配置信息,然后将该类序列化为XML,然后将该序列化的XML转换为XML节点:对吗?
您能把xmlserializer创建的字符串包装到它自己的xml标记中吗?

XmlSerializer xs = new XmlSerializer(typeof(MyConfig));
StringWriter xout = new StringWriter();
xs.Serialize(xout, myConfig);
XmlDocument x = new XmlDocument();
x.LoadXml("<myConfig>" + xout.ToString() + "</myConfig>");

现在x是一个包含一个元素“”的xmldocument,其中包含序列化的自定义配置。
这就是你要找的吗?

关于c# - 如何通过调用XmlSerializer.Serialize创建XmlNode?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46282/

10-09 01:10