【问题标题】:Set value of XML node as field on C# model in XML deserialization在 XML 反序列化中将 XML 节点的值设置为 C# 模型上的字段
【发布时间】:2019-04-23 15:54:19
【问题描述】:

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

我想将其中的每个 KeyValue 反序列化为如下所示的 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 中的一、二、三等进入我模型的 Value 字段。

这可能吗?如果是这样,我该怎么做?

【问题讨论】:

  • 所以你是说KeyValue 中的Value 没有被填充?
  • @Robert,是的,这是正确的。我希望它填充 KeyValue 节点的值。当我在它下面添加一个 Value 节点时它可以工作,但我希望我可以让它工作而不要求改变这个 XML 结构。
  • 需要一个包含 KeyValues 集合的对象,它需要一个序列化器以及 Keys。
  • 将您的 XML 插入 here 并查看生成的类。
  • 我猜你需要在 Value 属性上使用 [XmlText]

标签: c# xml xml-deserialization


【解决方案1】:

根据 Robert Harvey 的评论查看 this website 后,我意识到我缺少的是我的 Value 字段上的 [XmlText] 属性。我添加了它,经过测试,它确实有效。

【讨论】:

    【解决方案2】:

    在这种情况下我不会使用序列化,因为它需要我的类然后是其他方法。请参阅下面的 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; }
        }
    
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      相关资源
      最近更新 更多