2014-10-20 112 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),因为如果不是,您可以根本不需要返回元素感兴趣。这会将处理转移到服务器,这可能会或可能不会有好的表现。

相关问题