我正在使用一个类库,它代表了.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实例与内部XmlNode的XmlNodeReader.
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在我的数据之前调用类库配置中相同的方法.但是,这需要在调用Serialize之后,我的数据由XmlNode表示.使用XmlSerializer将对象序列化到XmlNode中的最佳方式是什么?
谢谢,
-kevin
btw–它似乎是由Chris Lovett编写的一个XmlNodeWriter类,可以从Microsoft一次就可以使用,但链接现在已经坏了.有没有人知道获得这个课程的另一个位置?
解决方法
因此,您需要让您的类包含自定义配置信息,然后将该类序列化为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是一个包含一个元素“< myconfig>”的XmlDocument,它在其中具有序列化的自定义配置.
这是什么你在找什么?