【问题标题】:How do I convert a C# class to an XMLElement or XMLDocument如何将 C# 类转换为 XMLElement 或 XMLDocument
【发布时间】:2016-06-09 18:44:26
【问题描述】:

我有一个 C# 类,我想使用 XMLSerializer 对其进行序列化。但我想让它序列化为 XMLElement 或 XMLDocument。这可能吗,还是我必须将其序列化为字符串,然后将字符串解析回 XMLDocument?

【问题讨论】:

  • 我也有同样的问题。你能请在这里为你工作的最终代码吗??

标签: c# xml


【解决方案1】:

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

序列化:

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

【讨论】:

  • 警告,microperf nit:在反序列化时最好在 XmlNode 周围使用 new XmlNodeReader() 作为 XmlReader 源,而不是将其转换为字符串并返回。字符串转换使用了大约两倍的挂钟时间和更多的内存(诚然,在正常情况下不多,但 NodeReader 方法也感觉更干净)。
  • 谢谢!我什至不知道那个读者的存在。这样看起来确实更干净。
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 2011-01-13
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多