首页 > 解决方案 > 在 C# 控制器中序列化 xml 请求

问题描述

假设我有这个用 c# 编码的类模式

public class Server
{
}

public class DataServer : Server
{
    public string ip { get; set; }
    public string name { get; set; }
    public string dataBaseName { get; set; }
}

public class ImageServer : Server
{
    public string ip { get; set; }
    public string name { get; set; }
    public int imageNumber { get; set; }
}

public class FeedServer : Server
{
    public string ip { get; set; }
    public string name { get; set; }
}


public class DataCenter
{

    public Server serverA { get; set; }

    public Server serverB { get; set; }

}

如果我在请求中得到这个 xml

<?xml version="1.0" encoding="UTF-8"?>
<DataCenter>
   <ImageServer>
      <ip>92.82.13.1</ip>
      <name>image server</name>
      <imageNumber>50</imageNumber>
   </ImageServer>
   <FeedServer>
      <ip>82.25.87.7</ip>
      <name>feed server</name>
   </FeedServer>
</DataCenter>

这可以序列化到此类模式吗?我的课程需要什么 XMLroot、XMLattributes……?

如果我没有参考这些名称,我该如何区分应该去 serverA 和 serverB 的内容?

控制器代码

[HttpPost("CheckSlip")]
public async Task<bool> SaveServers([FromBody] DataCenter dataCenter)
{
    // code
}

数据中心为空...我无法序列化它

标签: c#xmlasp.net-mvcserializationasp.net-core

解决方案


类结构和 XML 序列化属性必须反映 XML 才能正常工作。尝试手动创建这些类可能是一项相当耗时的任务。

我发现最简单的方法是让 Visual Studio 为您生成类。我在下面找到了一个可以在本地运行的快速示例。

第一的。复制要反序列化的 XML。然后在 Visual Studio 中添加一个新的空白类,然后选择 EDIT --> Paste Special --> Paste XML as Classes

这将在下面生成以下类

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public partial class DataCenter
    {

        private DataCenterImageServer imageServerField;

        private DataCenterFeedServer feedServerField;

        /// <remarks/>
        public DataCenterImageServer ImageServer
        {
            get
            {
                return this.imageServerField;
            }
            set
            {
                this.imageServerField = value;
            }
        }

        /// <remarks/>
        public DataCenterFeedServer FeedServer
        {
            get
            {
                return this.feedServerField;
            }
            set
            {
                this.feedServerField = value;
            }
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class DataCenterImageServer
    {

        private string ipField;

        private string nameField;

        private byte imageNumberField;

        /// <remarks/>
        public string ip
        {
            get
            {
                return this.ipField;
            }
            set
            {
                this.ipField = value;
            }
        }

        /// <remarks/>
        public string name
        {
            get
            {
                return this.nameField;
            }
            set
            {
                this.nameField = value;
            }
        }

        /// <remarks/>
        public byte imageNumber
        {
            get
            {
                return this.imageNumberField;
            }
            set
            {
                this.imageNumberField = value;
            }
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class DataCenterFeedServer
    {

        private string ipField;

        private string nameField;

        /// <remarks/>
        public string ip
        {
            get
            {
                return this.ipField;
            }
            set
            {
                this.ipField = value;
            }
        }

        /// <remarks/>
        public string name
        {
            get
            {
                return this.nameField;
            }
            set
            {
                this.nameField = value;
            }
        }
    }

然后创建一个 XMLSerializer 的实例并反序列化 xml。对于这个例子,我将 XML 放在一个字符串 var 中。

var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<DataCenter>\r\n   <ImageServer>\r\n      <ip>92.82.13.1</ip>\r\n      <name>image server</name>\r\n      <imageNumber>50</imageNumber>\r\n   </ImageServer>\r\n   <FeedServer>\r\n      <ip>82.25.87.7</ip>\r\n      <name>feed server</name>\r\n   </FeedServer>\r\n</DataCenter>";

            XmlSerializer s = new XmlSerializer(typeof(DataCenter));
            using (var reader = new StringReader(xml))
            {
                var item = (DataCenter)s.Deserialize(reader);
            }

您现在将拥有一个表示 XML 有效负载的对象。希望有帮助


推荐阅读