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.
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号