如何将复杂的 C# 类序列化为 XML 并将其作为 .net 核心 API 的响应发送?

Posted

技术标签:

【中文标题】如何将复杂的 C# 类序列化为 XML 并将其作为 .net 核心 API 的响应发送?【英文标题】:How to Serialize Complex C# class to XML and send it as response from .net core API? 【发布时间】:2020-02-26 06:33:20 【问题描述】:

我在 c# 中创建了一个对象(复杂对象),我想用 XML 从 API 发送响应。 如何将值设置为复杂节点并以适当的 XML 序列化它。

下面是我的代码..

    我要转换的 C# 对象
[XmlRoot]
[Serializable]
public class Response

    private Response headerField;

    private Response bodyField;

    /// <remarks/>
    public Response Header
    
        get
        
            return this.headerField;
        
        set
        
            this.headerField = value;
        
    

    /// <remarks/>
    public Response Body
    
        get
        
            return this.bodyField;
        
        set
        
            this.bodyField = value;
        
    



public class Header

    public string ACCT_NUM  get; set; 
    public string NIC  get; set; 
    public string requestId  get; set; 
    public string BankId  get; set; 


public class Body

    public string STATUS  get; set; 
    public Body ERROR  get; set; 


public class ERROR

    public string ERRORCODE  get; set; 

    /// <remarks/>
    public string ERRORDESC  get; set; 

    /// <remarks/>
    public string ERRORTYPE  get; set; 


    序列化代码,我通过该代码设置字段值并发送。


 var header = new Header()
            
                ACCT_NUM= arr[0].ACCT_NUM.ToString(),
                BankId= arr[0].BankId.ToString(),
                requestId= arr[0].requestId.ToString(),
                NIC= arr[0].NIC.ToString()
            ;

            var body = new Body()
            
                STATUS = "SUCCESS"
            ;

using(var stream=new MemoryStream())

    XmlSerializer xmlSer=new
    XmlSerializer(typeof(Response));xmlSer.Serialize(stream,new Response()
    
        Header = header,
        Body = body
    );

    stream.Position = 0;
    using(var reader = new StreamReader(stream, Encoding.UTF8))
    
        string value = reader.ReadToEnd();
    

请在此处指导我如何实现以 XML 序列化对象并将其作为 API 的响应发送。

【问题讨论】:

检查这个:这将有助于***.com/questions/38316358/… 嗨@ZeeCode 我尝试了很多但不明白。 【参考方案1】:

您可以将 xml 序列化支持添加到 .net core mvc。这将允许客户端通过设置 Accept 标头来请求 xml。

services.AddMvc(options =>

    options.RespectBrowserAcceptHeader = true; // false by default
    .OutputFormatters.Insert(0, new XmlSerializerOutputFormatter());
    options.FormatterMappings.SetMediaTypeMappingForFormat("xml", MediaTypeHeaderValue.Parse("application/xml"));
);

或者您可以根据请求路径中的格式参数匹配响应类型;

        [Route("id.format"), FormatFilter]
        public async Task<IActionResult> Load(int id)

【讨论】:

嗨@Jeremy Lakeman,是的,我的 post 方法接受 XML 作为请求,我能够应对下一个挑战是在 XML 中传递响应,我已经根据我创建了响应...上面的类创建了我希望它是我对 XML 中的 API 的响应。格式化程序会完成工作,但在我的情况下,我有需要在 xml 中序列化并简单传递的对象。【参考方案2】:

你可以试试这个

public string SerializeToString()
    
        var emptyNamespaces = new XmlSerializerNamespaces(new[]  XmlQualifiedName.Empty );
        var serializer = new XmlSerializer(this.GetType());
        var settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.OmitXmlDeclaration = true;

        using (var stream = new StringWriter())
        using (var writer = XmlWriter.Create(stream, settings))
        
            serializer.Serialize(writer, this, emptyNamespaces);
            return stream.ToString();
        
    

【讨论】:

嗨@Fazal Qayyun我如何访问复杂对象意味着如果你看到我的开始标签是响应然后是标题然后标题中有字段..我需要在xml中生成该流 您的代码只为我提供了以下 XML 响应。 w3.org/2001/XMLSchema-instance" xmlns:xsd="w3.org/2001/XMLSchema" /> 我希望我的回复如下
@MayurWaghulde 我已经更新了我的答案,希望对您有所帮助。请立即尝试以上一个。

以上是关于如何将复杂的 C# 类序列化为 XML 并将其作为 .net 核心 API 的响应发送?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 XML 反序列化为 C# 中的对象? [复制]

如何将 xml 元素值反序列化为 C# 类属性

将 Web 服务 API 中的 XML 字符串反序列化为 C# 对象

如何将 XML Choice 反序列化为正确的复杂类型

如何将XML Choice反序列化为正确的复杂类型

需要帮助将 XML 文件反序列化为对象 C#