Как преобразовать класс С# в XMLElement или XMLDocument

У меня есть класс С#, который я хотел бы сериализовать с помощью XMLSerializer. Но я хотел бы, чтобы он был сериализован в XMLElement или XMLDocument. Возможно ли это, или я должен сериализовать его в String, а затем проанализировать строку обратно в XMLDocument?

Ответ 1

Вы можете создать новый XmlDocument, а затем вызвать CreateNavigator(). AppendChild(). Это даст вам XmlWriter, который вы можете передать методу Serialize, который будет сбрасываться в корневой каталог.

Ответ 2

У меня тоже была эта проблема, и Мэтт Дэвис дал отличное решение. Просто опубликуйте некоторые фрагменты кода, так как есть несколько деталей.

Сериализация:

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

Ответ 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