Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在XML反序列化中,将XML节点的值设置为C#模型上的字段_C#_Xml_Xml Deserialization - Fatal编程技术网

在XML反序列化中,将XML节点的值设置为C#模型上的字段

在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">

我希望正确地反序列化一些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>
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
属性。