【问题标题】:Ds-serializing Xml to POCO objects array/list in C#在 C# 中 Ds 将 Xml 序列化为 POCO 对象数组/列表
【发布时间】:2020-12-17 19:56:35
【问题描述】:

我有一个以下格式的 xml 文件:

<?xml version=""1.0"" encoding=""UTF-8""?>
            <Options>
               <Header>
                  <H1>A</H1>
                  <H2>B</H2>
                  <H3>C</H3>
                </Header>
               <Include>
                  <Option A1="something" A2="something">SomeValue</Option>
                  <Option A1="something" A2="something">SomeOtherValue</Option>
               </Include>
            </Options>

我设法使用序列化程序对标头进行反序列化,但遇到了选项问题。具体来说,我有以下 C# 对象:

    [XmlRoot(ElementName="Option")]
    public class Option {
        [XmlAttribute(AttributeName="A1")]
        public string A1 { get; set; }
        [XmlAttribute(AttributeName="A2")]
        public string A2 { get; set; }
        [XmlText]
        public string Text { get; set; }
    }

    [XmlRoot(ElementName="Include")]
    public class OptionList {
        [XmlArrayItem("Option")]
        public List<Option> Options { get; set; }
    }

我使用这个序列化器进行转换:

        public IReadOnlyList<Option> ParseInclude(string xmlDocument)
        {
            using (var reader = new XmlTextReader(new StringReader(xmlDocument)))
            {
                var serializer = new XmlSerializer(typeof(OptionList));
                reader.ReadToFollowing("Include");
                var collection = (OptionList) serializer.Deserialize(reader);
                return collection .Options ;
            }
        }

但我无法让它工作 - 因为Options 为空,所以我在 return 语句中不断收到 NullReferenceException。有什么想法吗?

【问题讨论】:

  • 你的类Option应该是Include。
  • @jdweng 你说的包含是什么意思?

标签: c# .net xml-serialization


【解决方案1】:

尝试以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            string xmlDocument = File.ReadAllText(FILENAME);
            using (XmlReader reader = XmlReader.Create(new StringReader(xmlDocument)))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Option));
                Option collection = (Option)serializer.Deserialize(reader);
            }
        }
    }
    [XmlRoot(ElementName = "Options")]
    public class Option
    {
        public Header Header { get; set; }
        [XmlArray("Include")]
        [XmlArrayItem("Option")]
        public List<OptionList> Options { get; set; }
    }
    public class Header
    {
        public string H1 { get; set; }
        public string H2 { get; set; }
        public string H3 { get; set; }
    }
    public class OptionList
    {
        [XmlAttribute(AttributeName = "A1")]
        public string A1 { get; set; }
        [XmlAttribute(AttributeName = "A2")]
        public string A2 { get; set; }
        [XmlText]
        public string Text { get; set; }
    }
}

【讨论】:

  • 不是它不应该工作的原因。它已经过全面测试。
猜你喜欢
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2018-07-17
  • 2010-09-18
相关资源
最近更新 更多