xml如何获取其中的值呢,比如下面这样的:
非著名程序员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;
大功告成!有问题随时留言交流。
留下您的脚步
最近评论