由于工作需要需要将多个对象快速的组织到Xml文档中作为Xml文档数据节点,最先想到的是直接将泛型对象序列化后写入Xml文件中,但一秒钟后就自己否决了该方式,主要原因是序列化后节点的个性化程度不够高也不够灵活。
先上一段泛型对象序列化方法代码:
/// <summary>
/// Xml序列化帮助类
/// </summary>
public class XmlSerializerHelper
{
public static void SaveToXml<T>(string path, T o, Type type) where T : class
{
if ((!string.IsNullOrEmpty(path)) && (null != type))
{
type = type != null ? type : o.GetType();
using (StreamWriter writer = new StreamWriter(path))
{
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(type);
XmlSerializerNamespaces nameSpace = new XmlSerializerNamespaces();
nameSpace.Add("", "");
serializer.Serialize(writer, o, nameSpace);
}
}
}
}
测试一下序列化代码:
MessageInfo message = new MessageInfo()
{
MessageID = "1234567890",
MessageType = "SystemMessage",
MessageTitle = "MessageTitle",
MessageContent = "MessageContent",
SendTo = "Someone",
SendFrom = "WUWEI",
SendTime = DateTime.Now.ToString("yyyyMMddHHmmss")
};
XmlSerializerHelper.SaveToXml<MessageInfo>("../message.xml",message,message.GetType());
生成的Xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<MessageInfo>
<MessageID>1234567890</MessageID>
<MessageType>SystemMessage</MessageType>
<MessageTitle>MessageTitle</MessageTitle>
<MessageContent>MessageContent</MessageContent>
<SendTo>Someone</SendTo>
<SendFrom>WUWEI</SendFrom>
<SendTime>20170926103626</SendTime>
</MessageInfo>
优化后的生成方式帮助类如下:
public class XmlGenerateHelper
{
public static void MessageXmlGenerate(string path, string filename, Head head, List<MessageInfo> list)
{
XmlDocument doc = new XmlDocument();
XmlElement rootElement = doc.CreateElement("", "MSG", "");
doc.AppendChild(rootElement);
XmlNode rootNode = doc.SelectSingleNode("MSG");
XmlElement headNode = doc.CreateElement("Head");
rootNode.AppendChild(headNode);
foreach (PropertyInfo info in head.GetType().GetProperties())
{
XmlElement element = doc.CreateElement(info.Name);
element.InnerText = info.GetValue(head).ToString();
headNode.AppendChild(element);
}
XmlElement bodyNode = doc.CreateElement("Body");
rootNode.AppendChild(bodyNode);
foreach (MessageInfo obj in list)
{
XmlElement itemNode = doc.CreateElement("Item");
bodyNode.AppendChild(itemNode);
XmlElement informationNode = doc.CreateElement("Information");
itemNode.AppendChild(informationNode);
foreach (PropertyInfo info in obj.GetType().GetProperties())
{
XmlElement element = doc.CreateElement(info.Name);
element.InnerText = info.GetValue(obj).ToString();
informationNode.AppendChild(element);
}
}
doc.Save(string.Format("{0}{1}", path, filename));
}
}
测试优化后的帮助方法:
Head head = new Head()
{
MessageSendDateTime = DateTime.Now.ToString("yyyyMMddHHmmss"),
MessageSequence = "007",
MessageType = "SystemMessage",
SourceSystemID = "WEI",
DestinationSystemID = "XXXXX"
};
List<MessageInfo> list = new List<MessageInfo>();
for (int i = 0; i < 6; i++)
{
MessageInfo message = new MessageInfo()
{
MessageID = string.Format("123456789{0}",i),
MessageType = "SystemMessage",
MessageTitle = "MessageTitle",
MessageContent = "MessageContent",
SendTo = "Someone",
SendFrom = "WUWEI",
SendTime = DateTime.Now.ToString("yyyyMMddHHmmss")
};
}
XmlGenerateHelper.MessageXmlGenerate("../", "list.xml", head, list);
测试结果如下:
<MSG>
<Head>
<MessageSendDateTime>20170926105503</MessageSendDateTime>
<MessageSequence>007</MessageSequence>
<MessageType>SystemMessage</MessageType>
<SourceSystemID>WEI</SourceSystemID>
<DestinationSystemID>XXXXX</DestinationSystemID>
</Head>
<Body>
<Item>
<Information>
<MessageID>1234567890</MessageID>
<MessageType>SystemMessage</MessageType>
<MessageTitle>MessageTitle</MessageTitle>
<MessageContent>MessageContent</MessageContent>
<SendTo>Someone</SendTo>
<SendFrom>WUWEI</SendFrom>
<SendTime>20170926105503</SendTime>
</Information>
</Item>
<Item>
<Information>
<MessageID>1234567891</MessageID>
<MessageType>SystemMessage</MessageType>
<MessageTitle>MessageTitle</MessageTitle>
<MessageContent>MessageContent</MessageContent>
<SendTo>Someone</SendTo>
<SendFrom>WUWEI</SendFrom>
<SendTime>20170926105503</SendTime>
</Information>
</Item>
<Item>
<Information>
<MessageID>1234567892</MessageID>
<MessageType>SystemMessage</MessageType>
<MessageTitle>MessageTitle</MessageTitle>
<MessageContent>MessageContent</MessageContent>
<SendTo>Someone</SendTo>
<SendFrom>WUWEI</SendFrom>
<SendTime>20170926105503</SendTime>
</Information>
</Item>
<Item>
<Information>
<MessageID>1234567893</MessageID>
<MessageType>SystemMessage</MessageType>
<MessageTitle>MessageTitle</MessageTitle>
<MessageContent>MessageContent</MessageContent>
<SendTo>Someone</SendTo>
<SendFrom>WUWEI</SendFrom>
<SendTime>20170926105503</SendTime>
</Information>
</Item>
<Item>
<Information>
<MessageID>1234567894</MessageID>
<MessageType>SystemMessage</MessageType>
<MessageTitle>MessageTitle</MessageTitle>
<MessageContent>MessageContent</MessageContent>
<SendTo>Someone</SendTo>
<SendFrom>WUWEI</SendFrom>
<SendTime>20170926105503</SendTime>
</Information>
</Item>
<Item>
<Information>
<MessageID>1234567895</MessageID>
<MessageType>SystemMessage</MessageType>
<MessageTitle>MessageTitle</MessageTitle>
<MessageContent>MessageContent</MessageContent>
<SendTo>Someone</SendTo>
<SendFrom>WUWEI</SendFrom>
<SendTime>20170926105503</SendTime>
</Information>
</Item>
</Body>
</MSG>