欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

xml序列化和反序列化(一)

程序员文章站 2024-01-16 08:47:40
最近项目中需要调用第三方webservice,入参和出参采用xml格式,大致如下: 入参:   出参 ......

  最近项目中需要调用第三方webservice,入参和出参采用xml格式,大致如下:

  入参:

<?xml version="1.0" encoding="utf-8"?>

<RequestParams> 
  <PatientsName/> 
  <PatientsID/> 
</RequestParams>

出参:

<?xml version="1.0" encoding="utf-8"?>

<PacsResult>
<successe>true</successe>
<msg>成功</msg>
<reports>
   <report>
     <PatientsSex></PatientsSex>
     <PatientsName></PatientsName>
   </report>
</reports>
</PacsResult>

关于入参,项目中封装的有入参实体,实体类如下:

public class rep
{
public string PatientsName { get; set; }
public string PatientsID { get; set; }

}

现在就需要怎么将入参实体转换为xml格式字符串,代码如下:

   /// <summary>
    /// 序列化
    /// </summary>
    /// <param name="T">泛型t</param>
    /// <returns></returns>
    public static string XmlSerializerSR<T>(T t)
    {
        MemoryStream Stream = new MemoryStream();
        XmlSerializer xml = new XmlSerializer(typeof(T));
        try
        {
            //序列化对象
            xml.Serialize(Stream, t);
        }
        catch (InvalidOperationException)
        {
            throw;
        }
        Stream.Position = 0;
        StreamReader sr = new StreamReader(Stream);
        string str = sr.ReadToEnd();

        sr.Dispose();
        Stream.Dispose();

        return str;
    }

测试结果:

<?xml version="1.0"?>
<RequestParams xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  
  <PatientsName>Cui Jian Hong</PatientsName>  
  <PatientsID>P57748</PatientsID> 
</RequestParams>

有些人看到觉得这和入参不一样,

<?xml version="1.0"?>少了utf-8,<RequestParams》多了个xmlns(xml命名空间,我这里不作过多介绍)这个玩意;强迫症犯了,要求必须和入参一摸一样,我就尝试用另外一种方法:
public static string XmlSerializerXTW<T>(T t)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            //Add an empty namespace and empty value
            ns.Add("", "");
             XmlTextWriter textWriter = new XmlTextWriter(ms, Encoding.GetEncoding("UTF-8"));
            //StreamWriter streamWriter = new StreamWriter(ms, Encoding.GetEncoding("utf-8"))效果一样;
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            serializer.Serialize(textWriter, t, ns);

            string xmlMessage = Encoding.UTF8.GetString(ms.GetBuffer());
            xmlMessage = System.Text.RegularExpressions.Regex.Replace(xmlMessage, "^[^<]", "");
            ms.Close();
            textWriter.Close();
            return xmlMessage;
        }
    }

看到代码里为什么多了个正则表达式替换呢,原因是因为如果不加这个,序列化后是这样的

?<?xml version="1.0" encoding="utf-8"?>
<RequestParams>
  <PatientsName>Cui Jian Hong</PatientsName>
  <PatientsID>P57748</PatientsID>
</RequestParams>

注意第一个字符,不是粘贴错误,哈哈,实际就是多个问号;蛋疼了,网上找了半天,最后就这么解决了,哪位大神知道为什么,请告之。

写到这里有些人觉得,这么搞有点牵强,不完美,怎么办呢,还有终极杀招,自定义xml,无非就是拼接呗:可以这么搞:

 /// <summary>
    /// 拼接入参
    /// </summary>
    /// <param name="inParams"></param>
    /// <returns></returns>
    public static string CreateInParams(Dictionary<string, string> inParams,string inParamName)
    {
        string ret = string.Empty;
        XmlDocument doc = new XmlDocument();
        doc.AppendChild(doc.CreateXmlDeclaration("1.0", "utf-8", null));

        XmlElement xnIn = doc.CreateElement(inParamName);
        doc.AppendChild(xnIn);
        foreach (var de in inParams)
        {
            XmlElement xn = doc.CreateElement(de.Key);
            xn.InnerText = de.Value;
            xnIn.AppendChild(xn);
        }
        ret = doc.OuterXml;
        return ret;
    }

当然代码里是入参Dictionary<string, string>,不过这个可以任意定义,实体也行,数组也行。。。我这里只提供一个思路。

关于出参解析,请看下篇介绍