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;
大功告成!有问题随时留言交流。
川公网安备 51010702003150号
留下您的脚步
最近评论