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 @ 2025-01-15 17:04  IT王师傅  阅读(611)  评论(0)    收藏  举报