技术 思绪 摘录 旅行
在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输。

xml如何获取其中的值呢,比如下面这样的:

image.png

非著名程序员Carson说:太lou了


开源是程序员的基本美德


接下来看看我遇到的xml长啥样的

<root>
    <out_refund_no><![CDATA[201710101830454723]]></out_refund_no>
    <out_trade_no><![CDATA[201710101830454723]]></out_trade_no>
    <refund_account><![CDATA[REFUND_SOURCE_UNSETTLED_FUNDS]]></refund_account>
    <refund_fee><![CDATA[200]]></refund_fee>
    <refund_id><![CDATA[50000204292017101001977770763]]></refund_id>
    <refund_recv_accout><![CDATA[支付用户零钱]]></refund_recv_accout>
    <refund_request_source><![CDATA[API]]></refund_request_source>
    <refund_status><![CDATA[SUCCESS]]></refund_status>
    <settlement_refund_fee><![CDATA[200]]></settlement_refund_fee>
    <settlement_total_fee><![CDATA[200]]></settlement_total_fee>
    <success_time><![CDATA[2017-10-10 18:33:31]]></success_time>
    <total_fee><![CDATA[200]]></total_fee>
    <transaction_id><![CDATA[4200000011201710107264086890]]></transaction_id>
</root>

这是微信退款通知中的一段结果xml,如果按照老的方式读取,就不太好看了。

首先封装一个XmlHelper.cs

using System;
using System.IO;
using System.Xml.Serialization;

namespace C.Customization.Framework
{
    /// <summary>
    /// xml转换操作
    /// </summary>
    public class XmlHelper
    {
        #region 反序列化
        /// <summary>
        /// 反序列化
        /// </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 xmldes = new XmlSerializer(type);
                    return xmldes.Deserialize(sr);
                }
            }
            catch (Exception e)
            {
                LogHelper.WriteLog(e,"xml反序列化异常");
                return null;
            }
        }
        /// <summary>
        /// 反序列化
        /// </summary>
        /// <param name="type">The type.</param>
        /// <param name="stream">The stream.</param>
        /// <returns></returns>
        public static object Deserialize(Type type, Stream stream)
        {
            XmlSerializer xmldes = new XmlSerializer(type);
            return xmldes.Deserialize(stream);
        }
        #endregion
        #region 序列化
        /// <summary>
        /// 序列化
        /// </summary>
        /// <param name="type">类型</param>
        /// <param name="obj">对象</param>
        /// <returns></returns>
        public static string Serializer(Type type, object obj)
        {
            MemoryStream stream = new MemoryStream();
            XmlSerializer xml = new XmlSerializer(type);
            try
            {
                //序列化对象
                xml.Serialize(stream, obj);
            }
            catch (InvalidOperationException e)
            {
                LogHelper.WriteLog(e, "xml序列化异常");
                return string.Empty;
            }
            stream.Position = 0;
            StreamReader sr = new StreamReader(stream);
            string str = sr.ReadToEnd();
            sr.Dispose();
            stream.Dispose();
            return str;
        }

        #endregion

    }
}

代码不多,简洁。接下来写个对应的实体类。

using System.Xml.Serialization;

namespace C.Customization.Framework
{
    /// <summary>
    /// 退款通知加密信息
    /// </summary>
    [XmlRoot(Namespace = "",IsNullable = false,ElementName = "root")]
    public class RefundNoticeInfo
    {
        /// <summary>
        /// 微信订单号
        /// </summary>
        /// <value>
        /// The transaction identifier.
        /// </value>
        [XmlElementAttribute("transaction_id", IsNullable = false)]
        public string TransactionId { get; set; }

        /// <summary>
        ///商户订单号
        /// </summary>
        /// <value>
        /// The out trade no.
        /// </value>
        [XmlElementAttribute("out_trade_no", IsNullable = false)]
        public string OutTradeNo { get; set; }

        /// <summary>
        /// 微信退款单号
        /// </summary>
        /// <value>
        /// The refund identifier.
        /// </value>
        [XmlElementAttribute("refund_id", IsNullable = false)]
        public string RefundId { get; set; }

        /// <summary>
        /// 商户退款单号
        /// </summary>
        /// <value>
        /// The out refund no.
        /// </value>
        [XmlElementAttribute("out_refund_no", IsNullable = false)]
        public string OutRefundNo { get; set; }

        /// <summary>
        /// 订单总金额,单位为分,只能为整数,详见支付金额
        /// </summary>
        /// <value>
        /// The total fee.
        /// </value>
        [XmlElementAttribute("total_fee", IsNullable = false)]
        public int TotalFee { get; set; }

        /// <summary>
        /// 应结订单金额,单位为分
        /// </summary>
        /// <value>
        /// The settlement total fee.
        /// </value>
        [XmlElementAttribute("settlement_total_fee", IsNullable = false)]
        public int SettlementTotalFee { get; set; }

        /// <summary>
        /// 退款总金额,单位为分
        /// </summary>
        /// <value>
        /// The refund fee.
        /// </value>
        [XmlElementAttribute("refund_fee", IsNullable = false)]
        public int RefundFee { get; set; }

        /// <summary>
        /// 退款金额=申请退款金额-非充值代金券退款金额,退款金额< 等于申请退款金额
        /// </summary>
        /// <value>
        /// The settlement refund fee.
        /// </value>
        [XmlElementAttribute("settlement_refund_fee", IsNullable = false)]
        public int SettlementRefundFee { get; set; }

        /// <summary>
        /// 退款状态 SUCCESS-退款成功 CHANGE-退款异常 REFUNDCLOSE—退款关闭
        /// </summary>
        /// <value>
        /// The refund status.
        /// </value>
        [XmlElementAttribute("refund_status", IsNullable = false)]
        public string RefundStatus { get; set; }

        /// <summary>
        /// 退款成功时间 2017-12-15 09:46:01
        /// </summary>
        /// <value>
        /// The success time.
        /// </value>
        [XmlElementAttribute("success_time", IsNullable = false)]
        public string SuccessTime { get; set; }

        /// <summary>
        ///退款入账账户
        ///1)退回银行卡:{银行名称}{卡类型}{卡尾号} 2)退回支付用户零钱: 支付用户零钱 3)退还商户: 商户基本账户 商户结算银行账户  4)退回支付用户零钱通:支付用户零钱通
        /// </summary>
        /// <value>
        /// The refund recv accout.
        /// </value>
        [XmlElementAttribute("refund_recv_accout", IsNullable = false)]
        public string RefundRecvAccout { get; set; }

        /// <summary>
        ///退款资金来源 
        /// REFUND_SOURCE_RECHARGE_FUNDS 可用余额退款/基本账户   
        /// REFUND_SOURCE_UNSETTLED_FUNDS 未结算资金退款
        /// </summary>  
        /// <value>
        /// The refund account.
        /// </value>
        [XmlElementAttribute("refund_account", IsNullable = false)]
        public string RefundAccount { get; set; }

        /// <summary>
        /// 退款发起来源
        /// API接口
        /// VENDOR_PLATFORM商户平台
        /// </summary>
        /// <value>
        /// The refund request source.
        /// </value>
        [XmlElementAttribute("refund_request_source", IsNullable = false)]
        public string RefundRequestSource { get; set; }

    }
}

其中有几个特性需要解释一下:

    1、这个特性标注了xml中的根节点是root,但是我们实体类不叫这个名字,如果名字一样的则无需标注。

[XmlRoot(Namespace = "",IsNullable = false,ElementName = "root")]

    2、类中属性的标注,也是为了让序列化和反序列化的时候以标注的来解析,我们C#中使用的就使用标准命名的属性名称即可。

[XmlElementAttribute("refund_request_source", IsNullable = false)]


看重点:接下来,看下转换是怎么调用和操作的。

    1、实体类转xml

RefundNoticeInfo item = new RefundNoticeInfo();
string xml = XmlHelper.Serializer(typeof(RefundNoticeInfo),item);

    2、xml转指定实体类

string xxml = "<root><out_refund_no><![CDATA[201710101830454723]]></out_refund_no><out_trade_no><![CDATA[201710101830454723]]></out_trade_no><refund_account><![CDATA[REFUND_SOURCE_UNSETTLED_FUNDS]]></refund_account><refund_fee><![CDATA[200]]></refund_fee><refund_id><![CDATA[50000204292017101001977770763]]></refund_id><refund_recv_accout><![CDATA[支付用户零钱]]></refund_recv_accout><refund_request_source><![CDATA[API]]></refund_request_source><refund_status><![CDATA[SUCCESS]]></refund_status><settlement_refund_fee><![CDATA[200]]></settlement_refund_fee><settlement_total_fee><![CDATA[200]]></settlement_total_fee><success_time><![CDATA[2017-10-10 18:33:31]]></success_time><total_fee><![CDATA[200]]></total_fee><transaction_id><![CDATA[4200000011201710107264086890]]></transaction_id></root>";

RefundNoticeInfo reinfo = XmlHelper.Deserialize(typeof(RefundNoticeInfo), xxml) as RefundNoticeInfo;


大功告成!有问题随时留言交流。

CarsonIT 微信扫码关注公众号 策略、创意、技术

留下您的脚步

 

最近评论

查看更多>>

友情打赏

请打开您的微信,扫一扫