如何将C#类转换为XMLElement或XMLDocument

如何将C#类转换为XMLElement或XMLDocument,c#,xml,C#,Xml,我想使用XMLSerializer序列化一个类。但我希望将其序列化为XMLElement或XMLDocument。这是可能的,还是必须将其序列化为字符串,然后将字符串解析回XMLDocument?您可以创建一个新的XMLDocument,然后调用CreateNavigator().AppendChild()。这将为您提供一个XmlWriter,您可以将其传递给Serialize方法,该方法将转储到文档根目录中。我也遇到了这个问题,Matt Davis提供了一个很好的解决方案。只是发布一些代码片段

我想使用XMLSerializer序列化一个类。但我希望将其序列化为XMLElement或XMLDocument。这是可能的,还是必须将其序列化为字符串,然后将字符串解析回XMLDocument?

您可以创建一个新的XMLDocument,然后调用CreateNavigator().AppendChild()。这将为您提供一个XmlWriter,您可以将其传递给Serialize方法,该方法将转储到文档根目录中。

我也遇到了这个问题,Matt Davis提供了一个很好的解决方案。只是发布一些代码片段,因为还有一些细节

序列化: 反序列化:
public static T反序列化fromXmlElement(XmlElement)
{
var serializer=newxmlserializer(typeof(T));
返回(T)序列化程序。反序列化(新的XmlNodeReader(元素));
}

我也有同样的问题。请看这里为您提供的最后一段代码??警告,microperf nit:在反序列化时,最好在XmlNode周围使用新的XmlNodeReader()作为XmlReader源,而不是将其转换为字符串并返回。字符串转换使用了大约两倍的挂钟时间和更多的内存(无可否认,在正常情况下不会太多,但NodeReader方法感觉也更干净)。谢谢!我甚至不知道读者的存在。这样看起来确实更干净。
public static XmlElement SerializeToXmlElement(object o)
{
    XmlDocument doc = new XmlDocument();

    using(XmlWriter writer = doc.CreateNavigator().AppendChild())
    {
        new XmlSerializer(o.GetType()).Serialize(writer, o);
    }

    return doc.DocumentElement;
}
public static T DeserializeFromXmlElement<T>(XmlElement element)
{
    var serializer = new XmlSerializer(typeof(T));

    return (T)serializer.Deserialize(new XmlNodeReader(element));
}
Public Shared Function ConvertClassToXml(source As Object) As XmlDocument
    Dim doc As New XmlDocument()
    Dim xmlS As New XmlSerializer(source.GetType)
    Dim stringW As New StringWriter
    xmlS.Serialize(stringW, source)
    doc.InnerXml = stringW.ToString
    Return doc
End Function
Public Shared Function ConvertClassToXmlString(source As Object) As String
    Dim doc As New XmlDocument()
    Dim xmlS As New XmlSerializer(source.GetType)
    Dim stringW As New StringWriter
    xmlS.Serialize(stringW, source)
    Return stringW.ToString
End Function
Public Shared Function ConvertXmlStringtoClass(Of T)(source As String) As T
    Dim xmlS As New XmlSerializer(GetType(T))
    Dim stringR As New StringReader(source)
    Return CType(xmlS.Deserialize(stringR), T)
End Function
Public Shared Function ConvertXmlToClass(Of T)(doc As XmlDocument) As T
    Dim serializer = New XmlSerializer(GetType(T))
    Return DirectCast(serializer.Deserialize(doc.CreateNavigator.ReadSubtree), T)
End Function