在XML反序列化中,将XML节点的值设置为C#模型上的字段
我希望正确地反序列化一些XML XML的一部分如下所示:在XML反序列化中,将XML节点的值设置为C#模型上的字段,c#,xml,xml-deserialization,C#,Xml,Xml Deserialization,我希望正确地反序列化一些XML XML的一部分如下所示: <Keys> <Key> <Name>Test 1</Name> <KeyValues> <KeyValue Offered="true" Order="1">One</KeyValue> <KeyValue Offered="true" Order="2">
<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>
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);
}
这几乎可以正常工作。没有抛出异常,并且正确设置了顺序和提供,但是我希望XML中的KeyValues中的1、2、3等进入模型的Value字段
这可能吗?如果是这样,我该怎么做呢?看了Robert Harvey的评论后,我意识到我缺少的是我的值字段上的
[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; }
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序110
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XDocument doc=XDocument.Load(文件名);
列表键=文档子体(“键”)。选择(x=>newkey()
{
名称=(字符串)x.Element(“名称”),
Values=x.KeyValue(“KeyValue”)。选择(y=>newkeyValue(){
值=(字符串)y,
提供=(bool)y.Attribute(“提供”),
顺序=(int?)y.属性(“顺序”)
})托利斯先生()
}).ToList();
}
}
公开类密钥
{
公共字符串名称{get;set;}
公共列表值{get;set;}
}
公共类键值
{
公共字符串值{get;set;}
公共整数?顺序{get;set;}
公共bool提供{get;set;}
}
}
那么你是说KeyValue
中的Value
没有被填充?@Robert,是的,这是正确的。我希望用KeyValue节点的值填充它。当我在它下面添加一个值节点时,它就会工作,但我希望我可以让它正常工作,而不是要求更改此XML结构。需要一个包含KeyValues集合的对象,它需要一个serialiser,还需要一个键。插入XML并查看生成的类。我猜您需要使用Value
属性。