簡體   English   中英

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

[英]De-serialize XML string of different types

我想反序列化具有不同類型的XML字符串,該方法將字符串作為輸入參數,並且將接受5種類型的XML字符串。

目前,我的計划是選擇基於string.StartsWith方法反序列化XML String的類以查找類型。

有沒有更好的方法來找到反序列化的類類型?

我的第一個建議是允許用戶在輸入輸入時選擇類型,這樣您就不必閱讀字符串即可找到類型。

但是,如果您確實想要這樣做,則可以執行以下操作。 為了進行測試,我序列化了一個名為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 ),因此我不確定下一步如何處理它。

如果您問是否有一種優雅的方法可以基於字符串來推斷c#類型,那么我的回答是“不是真的”。 您將必須使用自己喜歡的機制來檢查輸入字符串,以便從字符串內容中推斷出類型。

或者根本不關心輸入是什么“類型”,而是在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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM