我希望正确反序列化一些XML。
部分XML看起来像这样:
<Keys>
<Key>
<Name>Test 1</Name>
<KeyValues>
<KeyValue Offered="true" Order="1">One</KeyValue>
<KeyValue Offered="true" Order="2">Two</KeyValue>
<KeyValue Offered="true" Order="3">Three</KeyValue>
<KeyValue Offered="true" Order="4">Four</KeyValue>
</KeyValues>
</Key>
<Key>
<Name>Test 2</Name>
<KeyValues>
<KeyValue Offered="true">One</KeyValue>
</KeyValues>
</Key>
</Keys>
我想将每个Key Value反序列化为一个C#对象,如下所示:
public class KeyValue
{
public string Value { get; set; }
[XmlAttribute]
public int Order { get; set; }
[XmlAttribute]
public bool Offered { get; set; }
}
这(大致)是我用来反序列化的代码:
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
using (TextReader reader = new StringReader(xml))
{
myObject = (MyObject)serializer.Deserialize(reader);
}
这几乎正常。没有抛出任何异常,并且正确设置了Order和Offered,但我希望我的XML中的KeyValues中的One,Two,Three等进入我模型的Value字段。
这可能吗?如果是的话,我怎么能这样做?
根据Robert Harvey的评论看了this website之后,我意识到我缺少的是我的Value字段的[XmlText]
属性。我补充说,测试,它的工作原理。
在这种情况下我不会使用序列化,因为它需要我的类然后其他方法。请参阅下面的xml linq解决方案:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication110
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
List<Key> keys = doc.Descendants("Key").Select(x => new Key()
{
Name = (string)x.Element("Name"),
Values = x.Descendants("KeyValue").Select(y => new KeyValue() {
Value = (string)y,
Offered = (bool)y.Attribute("Offered"),
Order = (int?)y.Attribute("Order")
}).ToList()
}).ToList();
}
}
public class Key
{
public string Name { get; set; }
public List<KeyValue> Values { get;set;}
}
public class KeyValue
{
public string Value { get; set; }
public int? Order { get; set; }
public bool Offered { get; set; }
}
}