C# 如何从对XmlSerializer.Serialize的调用创建XmlNode?

C# 如何从对XmlSerializer.Serialize的调用创建XmlNode?,c#,xml,C#,Xml,我正在使用一个类库,它在.xml中表示它的一些配置。使用XmlSerializer读入配置。幸运的是,表示.xml的类使用了xmlanyement属性,该属性允许我扩展配置数据以满足自己的需要,而无需修改原始类库 <?xml version="1.0" encoding="utf-8"?> <Config> <data>This is some data</data> <MyConfig> <data>Thi

我正在使用一个类库,它在.xml中表示它的一些配置。使用
XmlSerializer
读入配置。幸运的是,表示.xml的类使用了
xmlanyement
属性,该属性允许我扩展配置数据以满足自己的需要,而无需修改原始类库

<?xml version="1.0" encoding="utf-8"?>
<Config>
  <data>This is some data</data>
  <MyConfig>
    <data>This is my data</data>
  </MyConfig>
</Config>
我需要创建一个实用程序,它允许用户生成一个新的配置文件,其中既包括类库配置,也包括我自己的配置,因此将创建未从.xml文件读取的新对象。问题是如何将数据序列化回.xml

我意识到,在对类库配置调用相同的方法之前,首先必须对数据调用
XmlSerializer.Serialize
。但是,这要求我的数据在调用
Serialize
后由
XmlNode
表示。使用
XmlSerializer
将对象序列化为
XmlNode
的最佳方法是什么

谢谢

-凯文


顺便说一句——看起来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>");
XmlSerializer xs=新的XmlSerializer(typeof(MyConfig));
StringWriter xout=新StringWriter();
序列化(xout,myConfig);
XmlDocument x=新的XmlDocument();
x、 LoadXml(“+xout.ToString()+”);
现在,x是一个包含一个元素“”的XmlDocument,其中包含您的序列化自定义配置


这就是你想要的吗

一种解决方案是将内部对象序列化为字符串,然后将字符串加载到XmlDocument中,在那里可以找到表示数据的XmlNode并将其附加到外部对象

XmlSerializer xser1 = new XmlSerializer(typeof(Config));
XmlSerializer xser2 = new XmlSerializer(typeof(MyConfig));

MyConfig myConfig = new MyConfig();
myConfig.data = "My special data";

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
XmlWriter xw = new XmlTextWriter(sw);
xser2.Serialize(xw, myConfig);

XmlDocument doc = new XmlDocument();
doc.LoadXml(sb.ToString());

Config config = new Config();
config.data = "some new info";
config.element = doc.LastChild;

xser1.Serialize(fs, config);
然而,这个解决方案很麻烦,我希望有更好的方法,但现在它解决了我的问题


现在,如果我能在几个博客上找到传说中的XmlNodeWriter

至少有一个资源指向此作为XmlNodeWriter的替代品:。否则,您可以使用新的MSDN代码库替换版上的表单来编写MS,以替换寻找XmlNodeWriter的GotDotNet。

这需要一些工作,但XPathNavigator路由确实有效。。。请记住在XmlWriter上调用.Close,.Flush()不执行任何操作:

//DataContractSerializer serializer = new DataContractSerializer(typeof(foo));
XmlSerializer serializer = new XmlSerializer(typeof(foo));

XmlDocument doc = new XmlDocument();
XPathNavigator nav = doc.CreateNavigator();
XmlWriter writer = nav.AppendChild();
writer.WriteStartDocument();
//serializer.WriteObject(writer, new foo { bar = 42 });
serializer.Serialize(writer, new foo { bar = 42 });
writer.WriteEndDocument();
writer.Flush();
writer.Close();

Console.WriteLine(doc.OuterXml);

doc.DocumentElement
返回所需的
XmlNode
//DataContractSerializer serializer = new DataContractSerializer(typeof(foo));
XmlSerializer serializer = new XmlSerializer(typeof(foo));

XmlDocument doc = new XmlDocument();
XPathNavigator nav = doc.CreateNavigator();
XmlWriter writer = nav.AppendChild();
writer.WriteStartDocument();
//serializer.WriteObject(writer, new foo { bar = 42 });
serializer.Serialize(writer, new foo { bar = 42 });
writer.WriteEndDocument();
writer.Flush();
writer.Close();

Console.WriteLine(doc.OuterXml);