首页 > 编程语言 >.net Web API自动反序列化xml传参为C#实体

.net Web API自动反序列化xml传参为C#实体

时间:2024-10-19 11:01:43浏览次数:1  
标签:xml Web ElementName set string get XmlElement 序列化 public

Program.cs

.net 8.0已经内置了XML解析器,所以直接在services.AddControllers()后调用AddXmlSerializerFormatters()即可:

services.AddControllers().AddXmlSerializerFormatters();

定义实体

需要用到几个特性:

  1. XmlRoot:xml的根节点
  2. XmlElement:xml的成员
    例:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:i="http://i.api.ei.nxyincfuyou.iih/">
	<soapenv:Header/>
	<soapenv:Body>
		<i:apiEntry>
			<i:arg0>SI0084</i:arg0>
			<i:arg1>
				<![CDATA[
				<iihparam>
					<Code_user>00000</Code_user>
					<Code_dep></Code_dep>
					<Code_external>IIH</Code_external>
					<Data>
						<Code_dep></Code_dep>
						<Code_nur>00034</Code_nur>
						<Sd_status>25</Sd_status>
						<Date_b_in></Date_b_in>
						<Date_e_in></Date_e_in>
						<Date_b_out></Date_b_out>
						<Date_e_out></Date_e_out>
						<Date_b_update></Date_b_update>
						<Date_e_update></Date_e_update>
						<Pageinfos>
							<Pageinfo>
								<Pagesize>200</Pagesize>
								<Pageindex>1</Pageindex>
								<Pagecount></Pagecount>
								<Recordscount></Recordscount>
							</Pageinfo>
						</Pageinfos>
					</Data>
				</iihparam>
				]]>
			</i:arg1>
		</i:apiEntry>
	</soapenv:Body>
</soapenv:Envelope>
// 根元素
[XmlRoot(ElementName = "Envelope", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
public class H5_InpatientDataXML
{
    [XmlElement(ElementName = "Header", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
    public Header Header { get; set; }

    [XmlElement(ElementName = "Body", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
    public Body Body { get; set; }
}

public class Header
{
    // 你可以添加更多的头信息属性,如果需要的话
}

public class Body
{
    [XmlElement(ElementName = "apiEntry", Namespace = "http://i.api.ei.nxyincfuyou.iih/")]
    public ApiEntry ApiEntry { get; set; }
}

public class ApiEntry
{
    [XmlElement(ElementName = "arg0", Namespace = "http://i.api.ei.nxyincfuyou.iih/")]
    public string Arg0 { get; set; }

    [XmlElement(ElementName = "arg1", Namespace = "http://i.api.ei.nxyincfuyou.iih/")]
    public CData<IihParam> Arg1 { get; set; }
}
// Arg1中的嵌套 XML
[XmlRoot(ElementName = "iihparam")]
public class IihParam
{
    [XmlElement(ElementName = "Code_user")]
    public string CodeUser { get; set; }

    [XmlElement(ElementName = "Code_dep")]
    public string CodeDep { get; set; }

    [XmlElement(ElementName = "Code_external")]
    public string CodeExternal { get; set; }

    [XmlElement(ElementName = "Data")]
    public Data Data { get; set; }
}

public class Data
{
    [XmlElement(ElementName = "Code_dep")]
    public string CodeDep { get; set; }

    [XmlElement(ElementName = "Code_nur")]
    public string CodeNur { get; set; }

    [XmlElement(ElementName = "Sd_status")]
    public string SdStatus { get; set; }

    [XmlElement(ElementName = "Date_b_in")]
    public string DateBIn { get; set; }

    [XmlElement(ElementName = "Date_e_in")]
    public string DateEIn { get; set; }

    [XmlElement(ElementName = "Date_b_out")]
    public string DateBOut { get; set; }

    [XmlElement(ElementName = "Date_e_out")]
    public string DateEOut { get; set; }

    [XmlElement(ElementName = "Date_b_update")]
    public string DateBUpdate { get; set; }

    [XmlElement(ElementName = "Date_e_update")]
    public string DateEUpdate { get; set; }

    [XmlElement(ElementName = "Pageinfos")]
    public PageInfos PageInfos { get; set; }
}

public class PageInfos
{
    [XmlElement(ElementName = "Pageinfo")]
    public List<PageInfo> PageInfoList { get; set; }
}

public class PageInfo
{
    [XmlElement(ElementName = "Pagesize")]
    public string PageSize { get; set; }

    [XmlElement(ElementName = "Pageindex")]
    public string PageIndex { get; set; }

    [XmlElement(ElementName = "Pagecount")]
    public string PageCount { get; set; }

    [XmlElement(ElementName = "Recordscount")]
    public string RecordsCount { get; set; }
}

这里注意,CDATA区域需要自定义序列化方式以便框架调用,CDATA类:

public class CData<T> : IXmlSerializable where T : class
{
    public T Value { get; set; }
    public XmlSchema GetSchema() => null;

    public void ReadXml(XmlReader reader)
    {
        if (reader.IsEmptyElement)
        {
            reader.Read();
            Value = null;
        }
        else
        {
            string content = reader.ReadElementContentAsString();
            if (!string.IsNullOrEmpty(content))
            {
                var serializer = new XmlSerializer(typeof(T));
                using (var stringReader = new StringReader(content))
                {
                    Value = (T)serializer.Deserialize(stringReader);
                }
            }
        }
    }

    public void WriteXml(XmlWriter writer)
    {
        if (Value != null)
        {
            var serializer = new XmlSerializer(typeof(T));
            using (var stringWriter = new StringWriter())
            {
                serializer.Serialize(stringWriter, Value);
                writer.WriteCData(stringWriter.ToString());
            }
        }
    }

    public static implicit operator CData<T>(T value)
    {
        return new CData<T> { Value = value };
    }

    public static implicit operator T(CData<T> cdata)
    {
        return cdata?.Value;
    }
}

另外注意数据类型一般都是string,之前对于PageCount使用了int,测试时发现会报错。

Controller使用

        /// <summary>
        /// 获取患者的xml格式数据
        /// </summary>
        /// <param name="xmlData"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("TestXML")]
        public async Task<IActionResult> TestXML([FromBody] H5_InpatientDataXML envelope)
        {
            return Ok(envelope);
        }

标签:xml,Web,ElementName,set,string,get,XmlElement,序列化,public
From: https://www.cnblogs.com/throughFog/p/18475614

相关文章

  • 使用ArkWeb构建页面
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/......
  • WebView2 拦截查看所有的请求
    有两种方式:1.使用devtoolprotocol://启用网络监控awaitwebView.CoreWebView2.CallDevToolsProtocolMethodAsync("Network.enable","{}");//注册Network.requestWillBeSent事件varrequestWillBeSentReceiver=webView.CoreWebView2.GetDevToolsProtocolEv......
  • 【Java系列】基于Javaweb的在线餐饮管理系统设计与实现(源码+文档+部署讲解等)
    文章目录1.前言2.详细视频演示3.程序运行示例图4.文档参考5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue5.3程序操作流程6.选题推荐7.原创毕设案例8.系统测试8.1系统测试的目的8.2系统功能测试9.代码参考10.为什么选择我?11.获取源码1.前言......
  • Java最全面试题->Java基础面试题->JavaWeb面试题->Cookie/Session面试题
    Cookie/Session下边是我自己整理的面试题,基本已经很全面了,想要的可以私信我,我会不定期去更新思维导图哪里不会点哪里什么是Cookie?HTTPCookie(也叫WebCookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求......
  • 536.响应式大鱼海棠电影宣传网页 大学生期末大作业 Web前端网页制作 html+css+js
    目录一、网页概述二、网页文件 三、网页效果四、代码展示1.html2.CSS3.JS五、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强六、更多推荐欢迎光临仙女的网页世界!这里有各行各业的Web前端网页制作的案例,样式齐全新颖,并持续更新!感谢CSDN,提供了这......
  • JavaWeb基于ssm的校园一卡通密钥管理系统(001)
    获取源码请滑到最底部访问官网项目配套调试视频和相对应的软件安装包1、项目描述具体请看视频演示2、项目开发工具开发工具:Idea或Eclipse数据库:MysqlJar包仓库:Maven前端框架:Vue2后端框架:SSM3、项目图片4、演示视频JavaWeb基于ssm的校园一卡通密钥管理系统(001)......
  • (附论文)JavaWeb基于ssm的爱尚美家家具购物网站系统(002)
    获取源码请滑到最底部访问官网项目配套调试视频和相对应的软件安装包1、项目描述具体请看视频演示2、项目开发工具开发工具:Idea或Eclipse数据库:MysqlJar包仓库:Maven前端框架:JSP后端框架:SSM3、项目图片4、演示视频(附论文)JavaWeb基于ssm的爱尚美家家具购物网站......
  • java_day16_IO、序列化
    一、IO流IO流划分IO流【输入输出流】:按照流向划分:输入流:外部数据->java程序输出流:java程序->外部数据按照数据类型划分【根据使用记事本打开是否能够看懂来决定】字节流【万能流】:字节输入流:InputStream【抽象类】-......
  • (附论文)JavaWeb基于ssm的高校毕业设计信息管理系统(054)
    获取源码请滑到最底部访问官网项目配套调试视频和相对应的软件安装包1、项目描述具体请看视频演示2、项目开发工具开发工具:Idea或Eclipse数据库:MysqlJar包仓库:Maven前端框架:Vue2后端框架:SSM3、项目图片4、演示视频(附论文)JavaWeb基于ssm的高校毕业设计信息管理......
  • 泛型、序列化和反序列化
    一、泛型1.泛型概念①Java泛型(Generics) 是JDK5中引入的一个新特性。③定义类或者接口时可以使用泛型,通过继承或者实现,减少了冗余代码,提高了代码的复用性。④Java不能创建具体类型的泛型数组List[]li2=newArrayList[];类型形参:定义参数时不指定具体的类型,使......