2014-10-20 210 views
1

我有一個數據庫列,其中包含一些XML數據作爲字符串。因此我不知道這個XML所代表的實際類型,我想讀取這個XML的根標籤,而不是反序列化這個類型的完整內容。由於嵌入式XML可能相當大,並且表中包含數千個這些對象,因此我需要一個快速解決方案。我的第一個方法是使用一些字符串魔法(可能使用正則表達式)簡單地提取根標記,通過調用Type.GetType來獲取類型,然後爲此類型創建序列化程序。但是,我看了XMLReader,它也支持ValueType-屬性。在不知道類型的情況下反序列化XML

using (XmlReader reader = XmlReader.Create(new StringReader(myXmlAsString))) 
{ 
    reader.MoveToContent(); // get the root-element 
    Type type = reader.ValueType; 

    XmlSerializer ser = new XmlSerializer(type); 
    return ser.Deserialize(reader); 
} 

我必須面對的問題是,reader.ValueType總是返回字符串類型,而隨後由根標籤表示的類型。

最後:兩種解決方案中的哪一種會更快?第一個瓶頸應該是獲得tapeName的正則表達式引擎,第二個方法可能是讀取器操作。

回答

0

XmlReader.ValueType用於讀取XML節點的CLR類型,因此它不能用於確定您的序列化自定義類。

解析XML數據時,正則表達式並不是最方便的解決方案,請使用XML專用工具檢查第一個元素的名稱(例如,LINQ to XML)。

2

XML沒有類型(它只是結構化文本),所以您想要用於反序列化的類型取決於您,而不是XML。這就是爲什麼你必須傳遞一個類型名稱到XmlSerializer,這就是爲什麼XmlReader無法返回類型名稱,即使它想。如果你檢查序列化的XML,你會發現沒有.NET類型名稱(除非你自己包含它)。使用XmlReader獲取根元素名稱是一種好方法。當然,您應該絕對使用而不是,因爲XML不是常規語言 - 如果解決方案不正確,速度並不重要。但是,您應該使用reader.MoveToContent()來獲取根,而不是硬編碼的.Read()調用跳過特定數量的節點。

我不會擔心這種方法的性能,因爲大部分時間將花費在1)將整個字符串從數據庫服務器穿梭到客戶端以及2)反序列化內容。在1)和2)中都有減少的方法,但這個問題有點超出範圍。

另一種可能適用或不適合您的情況的解決方案是,使用SQL Server中的XML支持來讀取根元素(How to get the ROOT node name from SQL Server),因爲如果不是,您可以根本不需要返回元素感興趣。這會將處理轉移到服務器,這可能會或可能不會有好的表現。

相關問題