反序列化不同类型的XML字符串

时间:2016-06-29 01:29:44

标签: c# .net xml xml-deserialization

我想用不同类型反序列化我的XML字符串,该方法将字符串作为输入参数,它将接受5种类型的XML字符串。

目前我的计划是选择基于string.StartsWith方法反序列化XML String的类来查找类型。

有没有更好的方法来查找反序列化的类类型?

2 个答案:

答案 0 :(得分:1)

我的第一个建议是允许用户在输入输入时选择类型,这样您就不必读取字符串来查找类型。

然而,如果你真的,真的想,你可以做这样的事情。为了测试的目的,我序列化了一个名为MyClass的类。我很有创意。

var input = @"<MyClass xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""><MyString>Scott</MyString></MyClass>";

var xml = new XmlDocument();
xml.LoadXml(input);
//xml could be null
//Get the tag name of the root element which is
//the name of the serialized type.
var typeName = xml.DocumentElement.Name;
//Try to create a type from that root element's name.
var type = Type.GetType(typeName);
//If it doesn't match a type then it will be null.
if (type != null)
{
    //create an XmlSerializer for that type and deserialize the string.
    var serializer = new XmlSerializer(type);
    using (var sr = new StringReader(input))
    {
        var deserialized = serializer.Deserialize(sr);
    }
}

这将按照您的指定进行。但是现在就像你开始使用一个输入字符串可以序列化一些可能的类,现在你有一个objectdeserialized)也是无类型的,所以我不太确定你接下来要做什么。

答案 1 :(得分:0)

如果你问是否有一种优雅的方法来推断基于字符串的c#类型,那么我的回答是“不是真的”。您必须使用自己喜欢的机制来检查输入字符串,以从字符串内容中推断出类型。

或者根本不关心输入的'type'是什么,并在xmldocument上使用xpath来完成你的工作。

我最喜欢的c#类类型检测机制如下所示:

internal class Converter
{
    public T CovertXML<T>(string XMLString) where T:class
    {
        if (XMLString.ToLower().Contains(typeof(Type1).GetType().Name.ToLower()))
        {
            return XMLString.Deseralize<Type1>() as T;
        }
        //..etc etc.
        return null;
    }
}
internal class Type1
{
}
public static class StringExtensionMethods
{
     public static T Deseralize<T>(this string Instance)
    {
        System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));
        using (System.IO.StringReader sr = new System.IO.StringReader(Instance))
            return (T)ser.Deserialize(sr);
    }
}