复杂的xml转化为java实体
一、樣例一:
以根據(jù)訂單號(hào)向支付寶查詢(xún)支付是否成功為例(成功信息)
失敗信息:
<?xml version="1.0" encoding="utf-8"?>
<alipay>
<is_success>F</is_success>
<error>TRADE_NOT_EXIST</error>
</alipay>
成功信息:
<?xml version="1.0" encoding="utf-8"?>
<alipay>
<is_success>T</is_success>
<request>
<param name="_input_charset">utf-8</param>
<param name="service">single_trade_query</param>
<param name="partner">2088121424678319</param>
<param name="out_trade_no">H161021114440198N</param>
</request>
<response>
<trade>
<body>訂單:T16102111443568</body>
<buyer_email>1176760525@qq.com</buyer_email>
<buyer_id>2088402231747066</buyer_id>
<discount>0.00</discount>
<flag_trade_locked>0</flag_trade_locked>
<gmt_create>2016-10-21 11:45:06</gmt_create>
<gmt_last_modified_time>2016-10-21 11:45:16</gmt_last_modified_time>
<gmt_payment>2016-10-21 11:45:17</gmt_payment>
<is_total_fee_adjust>F</is_total_fee_adjust>
<operator_role>B</operator_role>
<out_trade_no>H161021114440198N</out_trade_no>
<payment_type>1</payment_type>
<price>0.01</price>
<quantity>1</quantity>
<seller_email>pay@gstarcad.com</seller_email>
<seller_id>2088121424678319</seller_id>
<subject>的生活費(fèi)...</subject>
<time_out>2017-01-20 11:45:17</time_out>
<time_out_type>finishFPAction</time_out_type>
<to_buyer_fee>0.00</to_buyer_fee>
<to_seller_fee>0.01</to_seller_fee>
<total_fee>0.01</total_fee>
<trade_no>2016102121001004060245497067</trade_no>
<trade_status>TRADE_SUCCESS</trade_status>
<use_coupon>F</use_coupon>
</trade>
</response>
<sign>25217c932f49868371a301e3151201a2</sign>
<sign_type>MD5</sign_type>
</alipay>
首先解析is_success字段的值,看看結(jié)果是T(成功)還是F(失敗),具體就不詳細(xì)作解釋,這里只分析為T(mén)時(shí)的數(shù)據(jù),一定要判斷,否則若為F再解析因XML格式不一會(huì)報(bào)錯(cuò)
Map<Object, Object> map = new HashMap<Object, Object>();
map = XMLUtil.doXMLParse(result);
String is_success = map.get("is_success").toString();
1、工具類(lèi)XStreamHandle中定義兩個(gè)方法:
/**
?? ?? * 實(shí)體轉(zhuǎn)xml字符串
???? * @param obj
? ??? * @return
??? ? */
??? public static String toXml(Object obj) {
??????? XStream xstream = new XStream(new DomDriver("utf8"));
??????? xstream.processAnnotations(obj.getClass()); // 識(shí)別obj類(lèi)中的注解
??????? ?return xstream.toXML(obj);
??? }
??? /**
???? * 字符串轉(zhuǎn)實(shí)體
???? * @param xmlStr
???? * @param cls
???? * @return
???? */
??? public static <T> T toBean(String xmlStr, Class<T> cls) {
????? ?? XStream xstream = new XStream(new DomDriver());
?????? ? xstream.processAnnotations(cls);
????? ?? @SuppressWarnings("unchecked")
??????? T t = (T) xstream.fromXML(xmlStr);
??????? return t;
??? }
2、根據(jù)節(jié)點(diǎn)的層級(jí)關(guān)系定義實(shí)體(此為重點(diǎn))
由頂級(jí)節(jié)點(diǎn)alipay建的實(shí)體Alipay 類(lèi)(Alipay -response-trade) request暫時(shí)不需要解析可用String接收
省略get,set方法
?
Alipay 的下級(jí)節(jié)點(diǎn)response建造類(lèi)Response
省略get,set方法
?
Response的下級(jí)節(jié)點(diǎn)trade建造類(lèi)
xml中所有的標(biāo)簽都要解析,否則會(huì)報(bào)錯(cuò)
3、調(diào)用
String xml="..."; ?//xml字符串
? Alipay alipay = XStreamHandle.toBean(xml, Alipay.class);
Trade trade =?alipay.getResponse().getTrade();
二、樣例二
books中有好多book數(shù),有價(jià)格,書(shū)名,作者
xml樣式:
<?xml version="1.0" encoding="utf-8"?>
<books>
<book price="108">
<name>Java編程思想</name>
<author>Bruce Eckel</author>
</book>
<book price="52">
<name>Effective Java</name>
<author>Joshua Bloch</author>
</book>
<book price="118">
<name>Java 7入門(mén)經(jīng)典</name>
<author>Ivor Horton</author>
</book>
</books>
1、工具類(lèi)還用樣例一中的工具類(lèi),這里不做重復(fù)了
2、根據(jù)節(jié)點(diǎn)的層級(jí)關(guān)系定義實(shí)體
根據(jù)頂級(jí)元素books創(chuàng)建實(shí)體
根據(jù)子級(jí)創(chuàng)建book類(lèi)
?3、調(diào)用
String xmlString = "......"; ? //xml內(nèi)容
Books books = XStreamHandle.toBean(xmlString, Books.class);
List<Book> booklist = books.getList();
System.out.println(booklist.size());
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/fengzhanfei/p/6140290.html
總結(jié)
以上是生活随笔為你收集整理的复杂的xml转化为java实体的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: phpexcel用法(转)
- 下一篇: div中的内容水平垂直居中