碰巧的是,
ArrayOfKeyValueOfstringstring
是元素名称
DataContractSerializer
序列化时选择
Dictionary<string, string>
,因此,使用该序列化程序来反序列化XML要容易得多。
首先,介绍以下扩展方法:
public static partial class DataContractSerializerExtensions
{
public static T ToContractObject<T>(this XContainer doc, DataContractSerializer serializer = null)
{
if (doc == null)
throw new ArgumentNullException();
using (var reader = doc.CreateReader())
{
return (T)(serializer ?? new DataContractSerializer(typeof(T))).ReadObject(reader);
}
}
}
现在您可以将XML解析为
List<Dictionary<string, string>>
具体如下:
var dictionaries = document.Descendants()
.Where(d => d.Name.LocalName == "ArrayOfKeyValueOfstringstring")
.Select(d => d.ToContractObject<Dictionary<string, string>>())
.ToList();
然后,您可以将字典列表映射到首选模型。
但是,如果出于任何原因,您必须使用
XmlSerializer
,而是引入以下扩展方法和数据模型:
public static partial class XmlSerializerExtensions
{
public static T ToObject<T>(this XContainer doc, XmlSerializer serializer = null)
{
if (doc == null)
throw new ArgumentNullException();
using (var reader = doc.CreateReader())
{
return (T)(serializer ?? new XmlSerializer(typeof(T))).Deserialize(reader);
}
}
}
[XmlRoot(ElementName = "KeyValueOfstringstring", Namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays")]
public class KeyValueOfstringstring
{
[XmlElement(ElementName = "Key", Namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays")]
public string Key { get; set; }
[XmlElement(ElementName = "Value", Namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays")]
public string Value { get; set; }
}
[XmlRoot(ElementName = "ArrayOfKeyValueOfstringstring", Namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays")]
public class ArrayOfKeyValueOfstringstring
{
[XmlElement(ElementName = "KeyValueOfstringstring", Namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays")]
public List<KeyValueOfstringstring> KeyValueOfstringstring { get; set; }
}
并反序列化如下:
var results = document.Descendants()
.Where(d => d.Name.LocalName == "ArrayOfKeyValueOfstringstring")
.Select(d => d.ToObject<ArrayOfKeyValueOfstringstring>())
.ToList();
备注:
尽管如此,因为XML看起来可能是由
wcf service
,该服务是否有可能提供
WSDL Metadata
?如果是这样,您可以自动生成客户端。看见
有关如何执行此操作的文档。