如果我有XML,则喜欢:
<Foo>
<Bar>
<A>aaaa</A>
<B>bbb</B>
</Bar>
<C>ccc</C></Foo>
我可以将其验证为具有字典结构和字符串属性(如使用相同的数据合同求职者)之类的foo类吗?用a和b作为键," aaaa"one_answers" bbb"作为字典中的值?
[DataContract]
class Foo
{
[DataMember]
public Dictionary<string, string> Bar
{ get; set; }
[DataMember]
public string C { get; set; }
}
我知道有一个示例使用MSDN站点上的CollectionDataContract,但它仅将A作为键和B作为值。
无法自动执行此操作。如果要使用字典,则应将linq用于XML,然后自己创建一个。
我认为您可以达到的最接近的东西就是这样
<UserQuery.Foo xmlns="http://schemas.datacontract.org/2004/07/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Bar>
<Barentry>
<A>aaa</A>
<B>bbb</B>
</Barentry>
</Bar>
<C i:nil="true"/>
</UserQuery.Foo>
使用此代码测试:
void Main()
{
var B=new Bar();
B.Add("aaa","bbb");
var tFoo=new Foo(){Bar=B};
DataContractSerializer ser=new DataContractSerializer(typeof(Foo));
ToXml<Foo>(tFoo).Dump();
}
public static string ToXml<T>(T obj)
{
DataContractSerializer dataContractSerializer = new DataContractSerializer(obj.GetType());
String text;
using (MemoryStream memoryStream = new MemoryStream())
{
dataContractSerializer.WriteObject(memoryStream, obj);
byte[] data = new byte[memoryStream.Length];
Array.Copy(memoryStream.GetBuffer(), data, data.Length);
text = Encoding.UTF8.GetString(data);
}
return text;
}
[System.Runtime.Serialization.DataContract]
public class Foo
{
[System.Runtime.Serialization.DataMember]
public Bar Bar
{ get; set; }
[System.Runtime.Serialization.DataMember]
public string C { get; set; }
}
[CollectionDataContract
(ItemName="Barentry",
KeyName = "A",
ValueName = "B")]
public class Bar:Dictionary<string,string>{
}