• 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>,不过这个可以任意定义,实体也行,数组也行。。。我这里只提供一个思路。

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

  • 相关阅读:
    HDU 2896 病毒侵袭 AC自动机
    AC自动机
    BZOJ2337: [HNOI2011]XOR和路径 期望概率dp 高斯
    BZOJ4008. [HNOI2015]亚瑟王 期望概率dp
    BZOJ 2707: [SDOI2012]走迷宫 拓扑+高斯消元+期望概率dp+Tarjan
    CodeForces743E. Vladik and cards 二分+状压dp
    BZOJ 3270 博物馆 && CodeForces 113D. Museum 期望概率dp 高斯消元
    BZOJ1415: [Noi2005]聪聪和可可 最短路 期望概率dp
    CodeForces 167B
    [HEOI2017]分手是祝愿 期望概率dp 差分
  • 原文地址:https://www.cnblogs.com/yaphetsfang/p/9027716.html
Copyright © 2020-2023  润新知