最近需要接入微信支付的返回参数,将其入库,微信的返回参数是xml格式的,这里采用sax进行数据解析
package com.xx.utils;
import java.io.StringReader;
import java.util.List;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.xml.sax.InputSource;
/**
* SAX解析xml字符串
* 依赖:
* <dependency>
* <groupId>dom4j</groupId>
* <artifactId>dom4j</artifactId>
* <version>1.6.1</version>
* </dependency>
* 需求:解析微信支付返回数据入库
* 微信支付返回参数格式:
* <h1>
* <p1></p1>
* <p2></p2>
* <p3></p4>
* </h1>
*/
public class xmlUtil {
public static void main(String[] args) throws DocumentException {
String xml = "<xml><appid><![CDATA[wx2421b1c4370ec43b]]></appid><attach><![CDATA[支付测试]]></attach><bank_type><![CDATA[CFT]]></bank_type><fee_type><![CDATA[CNY]]></fee_type> <is_subscribe><![CDATA[Y]]></is_subscribe> <mch_id><![CDATA[10000100]]></mch_id> <nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str> <openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid> <out_trade_no><![CDATA[1409811653]]></out_trade_no> <result_code><![CDATA[SUCCESS]]></result_code> <return_code><![CDATA[SUCCESS]]></return_code> <sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign> <sub_mch_id><![CDATA[10000100]]></sub_mch_id> <time_end><![CDATA[20140903131540]]></time_end> <total_fee>1</total_fee> <coupon_fee_0><![CDATA[10]]></coupon_fee_0> <coupon_count><![CDATA[1]]></coupon_count> <coupon_type><![CDATA[CASH]]></coupon_type> <coupon_id><![CDATA[10000]]></coupon_id> <trade_type><![CDATA[JSAPI]]></trade_type> <transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id> </xml>";
// String xml = "<h1><p><span>1</span></p><p><span>2</span></p></h1>";
InputSource in = new InputSource(new StringReader(xml));
in.setEncoding("UTF-8");
SAXReader reader = new SAXReader();
Document document = reader.read(in);// 如果是xml文件这里直接写xml文件的绝对路径
Element root = document.getRootElement();// 获取根节点
List<Element> elements = root.elements();// 查找子节点
for (Element element : elements) {// 读取到第一个子节点
System.out.println(element.getName() + ":" + element.getTextTrim()); // 如果是<h1><p>1</p><p1>2</p1></h1>这样的格式,这样就可以读取到数据了
// for(Element ele : (List<Element>)element.elements()){// 读取到第二个子节点
// System.out.println(ele.getName() + ":" + ele.getTextTrim());// 如果是<h1><p><span>1</span></p><p><span>2</span></p></h1>这样的数据就需要继续向下读取,以此类推
// }
}
}
}