abstract:一、概述最近在使用第三方服務(wù)接口,要求請求輸入和響應(yīng)輸出報(bào)文都是xml格式。因?yàn)槭敲嫦驅(qū)ο缶幊蹋哉{(diào)用接口之前已封裝好請求參數(shù)的對象實(shí)體;同理,接口返回結(jié)果已封裝成輸出結(jié)果的對象實(shí)體。整個(gè)過程要求類對象序列化成xml字符串,以及xml字符串反序列化成類對象。xml格式如下:<?xml version="1.0" encoding="gb2312"?&
一、概述
最近在使用第三方服務(wù)接口,要求請求輸入和響應(yīng)輸出報(bào)文都是xml格式。因?yàn)槭敲嫦驅(qū)ο缶幊?,所以調(diào)用接口之前已封裝好請求參數(shù)的對象實(shí)體;同理,接口返回結(jié)果已封裝成輸出結(jié)果的對象實(shí)體。整個(gè)過程要求類對象序列化成xml字符串,以及xml字符串反序列化成類對象。
xml格式如下:
<?xml version="1.0" encoding="gb2312"?>
<stream>
<action>DLBREGSN</action>
<userName>CHH</userName>
<accGenType /><calInterestFlag />
<branch />
<list name="">
<row>
<contactName>nameCHH</contactName>
<contactPhone>phone123</contactPhone>
<mailAddress>mail@</mailAddress>
</row>
</list>
</stream>
注意以下內(nèi)容:
1.encoding="gbk2312",這個(gè)根據(jù)接口要求不同,可以在序列化時(shí)指定格式gbk2312 或 utf-8
2.xml必須有跟節(jié)點(diǎn),根節(jié)點(diǎn)名稱默認(rèn)是類對象的類名,也可以給類對象加上xmlroot特性指定其他別名
3.元素節(jié)點(diǎn)包括四部分:節(jié)點(diǎn)名稱(默認(rèn)類屬性名稱)、節(jié)點(diǎn)開/閉之間的內(nèi)容(默認(rèn)類屬性值)、節(jié)點(diǎn)屬性(在類屬性上加特性XmlAttribute)、節(jié)點(diǎn)屬性值(已有XmlAttribute特性的類屬性值)
4.節(jié)點(diǎn)又包含節(jié)點(diǎn),且節(jié)點(diǎn)內(nèi)容是相同元素的數(shù)組,數(shù)組對應(yīng)類對象的object[ ]類型
5.類對象屬性值為null值時(shí),不被序列化成xml節(jié)點(diǎn)元素,當(dāng)然也可以在序列化時(shí)設(shè)置強(qiáng)制要求被序列化;值為空時(shí)"",別序列化成自動閉合元素,如:<branch />
6.xml區(qū)分大小寫,類對象名稱、屬性名稱必須與xml元素大小寫保持一致
二、定義實(shí)體類對象
[XmlRoot(ElementName = "stream")] // 定義xml節(jié)點(diǎn)元素別名,非默認(rèn)的類名
public class Stream
{
public string status { get; set; }
public string statusText { get; set; }
public string subAccNo { get; set; }
public string subAccNm { get; set; }
public string hostNo { get; set; }
[XmlElement(ElementName = "list")]
public DataList List { get; set; }
}
[XmlRoot(ElementName = "list")]
public class DataList
{
[XmlAttribute]// name是list元素的屬性,而不是list的子元素
public string name { get; set; }
//[XmlArray] // 被包含的層級關(guān)系,即row里面包含row
[XmlElement(ElementName = "row")] // 兄弟平級關(guān)系,即每個(gè)row是獨(dú)立并行
public DataRow[] Row { get; set; }
}
[XmlRoot(ElementName = "row")]
public class DataRow
{
public string contactName { get; set; }
public string contactPhone { get; set; }
public string mailAddress { get; set; }
}
三、XML幫助類實(shí)現(xiàn)序列化與反序列化
public class XmlHelper
{
/// <summary>
/// 將xml字符串反序列化對象
/// </summary>
/// <param name="type">對象類型</param>
/// <param name="xml">xml字符串</param>
/// <returns></returns>
public static object Deserialize(Type type, string xml)
{
try
{
using (StringReader sr = new StringReader(xml))
{
XmlSerializer xmlS = new XmlSerializer(type);
return xmlS.Deserialize(sr);
}
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// 對象序列化成xml字符串
/// </summary>
/// <param name="type">對象類型</param>
/// <param name="obj">被序列化的對象</param>
/// <param name="encodingName">xml編碼格式:utf-8,gbk,gb2312</param>
/// <param name="xmlRootName">xml根節(jié)點(diǎn)名稱</param>
/// <returns></returns>
public static string Serializer(Type type, object obj,string encodingName="utf-8"
, string xmlRootName = "")
{
XmlSerializer xmlS = string.IsNullOrWhiteSpace(xmlRootName)
? new XmlSerializer(type)
: new XmlSerializer(type, new XmlRootAttribute(xmlRootName));
try
{
using (MemoryStream Stream = new MemoryStream())
{
XmlWriterSettings settings=new XmlWriterSettings();
settings.Encoding=Encoding.GetEncoding(encodingName);
settings.OmitXmlDeclaration=false; // 是否生成<?xml version="1.0" encoding="utf-8"?>
settings.WriteEndDocumentOnClose = true;
settings.Indent = true; // 自動格式化,縮進(jìn)對齊
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add(string.Empty, string.Empty); // 去除默認(rèn)生成的命名空間:xmlns:xsd和xmlns:xsi
XmlWriter xWr=XmlWriter.Create(Stream,settings);
xmlS.Serialize(xWr, obj, ns);
Stream.Position = 0;
using (StreamReader sr = new StreamReader(Stream, Encoding.GetEncoding(encodingName)))
{
string str = sr.ReadToEnd();
return str;
}
}
}
catch (Exception)
{
return string.Empty;
}
}
}