C#使用XmlSerializer进行XML序列化和反序列化

根据项目需求,需生成非常复杂的XML文件,基本是按照电子病历模板来的,磕磕绊绊的,总算弄出来了,把踩过的坑记录一下。
1、XML序列化的核心——XmlSerializer类的Serialize()方法

2、去除默认命名空间和前缀

	XmlSerializer serializer = new XmlSerializer(typeof(ClinicalDocument));
	XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
	serializer.Serialize(xmlWriter, param, ns);

3、去除XML声明(即<?xml version="1.0" ?>)

	XmlWriterSettings settings = new XmlWriterSettings
	{
		Indent = true,
		OmitXmlDeclaration = true
	};
	using (StringWriter stringWriter = new StringWriter())
	{
		using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, settings))
		{
			XmlSerializer serializer = new XmlSerializer(typeof(ClinicalDocument));
			XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
			serializer.Serialize(xmlWriter, param, ns);
		}
		xmlString.Append(stringWriter.ToString());
	}

4、换行缩进和指定缩进字符

	XmlWriterSettings settings = new XmlWriterSettings
	{
		Indent = true,
		IndentChars = "-",
		OmitXmlDeclaration = true
	};

5、XmlRoot,定义大节点名称和命名空间

    [XmlRoot(ElementName = "ClinicalDocument", Namespace = "urn:hl7-org:v3")]
    public class ClinicalDocument

6、XmlElement,指定节点名称

	[XmlElement("realmCode")]
	public CodeEntity realmCode { get; set; }

7、XmlAttribute,指定属性名称

	[XmlAttribute("code")]
	public string code { get; set; }

8、XmlText,值

	[XmlText]
	public string Text { get; set; }

9、XmlArrayItem,数组

	[XmlArrayItem]
	public CodeEntity[] realmCode { get; set; }

注意,定义不同的特性,序列化的结果是有区别的,一个带数组名称,一个不带数组名称,对比如下:

10、设置xsi:type

定义:

	[XmlAttribute(AttributeName = "type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
	public string type { get; set; }

实例化:

	value = new CodeSystemEntity()
	{ 
		type="CD", 
		code="",
		displayName="",
		codeSystem="2.16.156.10011.2.3.3.11",
		codeSystemName="ICD-10"
	}

11、XmlEnum,定义枚举

	public enum DocStatus
	{
		[XmlEnum(Name = "Create")]
		Create,
		[XmlEnum(Name = "Paid")]
		paid,
		[XmlEnum(Name = "Done")]
		done
	}

 

补充:XML的反序列化,对象的定义如上,下面是反序列化的执行代码:

JH0410OutParam outParam = new JH0410OutParam();
XmlSerializer xmlSeriOut = new XmlSerializer(typeof(JH0410OutParam));
using (StringReader reader = new StringReader(serviceResult))
{
    outParam = (JH0410OutParam)xmlSeriOut.Deserialize(reader);
}

 

Done.

 

posted on   IT王师傅  阅读(132)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix

导航

统计

点击右上角即可分享
微信分享提示