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

16

我有一个C#类,想要使用XMLSerializer进行序列化。但我希望它序列化为一个XMLElement或XMLDocument。这是否可能?还是必须将其序列化为字符串,然后解析该字符串以获得XMLDocument?


我遇到了同样的问题。你能否在这里分享一下最终的代码,让我也参考一下? - Manish Basantani
3个回答

39

我也遇到过这个问题,Matt Davis提供了一个很好的解决方案。在这里分享一些代码片段,因为还有一些细节需要注意。

序列化:

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));
}

2
警告,微小的性能问题:在反序列化时,最好使用new XmlNodeReader()将XmlNode作为XmlReader源而不是将其转换为字符串再转回来。字符串转换使用大约双倍的墙钟时间和更多的内存(诚然,在正常情况下并不多,但NodeReader方法感觉更清洁)。 - nitzmahone
谢谢!我甚至不知道那个读取器的存在。它看起来确实更加干净。 - Dave Andersen

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

-1
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接