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号