java常用的数据格式分xml和json,最近用webservice接口需要用到了xml解析,在这里记录下;
1、xml的数据为:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<RETURN_CODE>0</RETURN_CODE>
<RETURN_DESC>成功!</RETURN_DESC>
<RETURN_INFO>
<order_info>
<so_nbr>7003400</so_nbr>
<cust_id>0045289</cust_id>
<appl_date>2019-03-08 15:09:35</appl_date>
<compl_date>2019-03-08 15:57:35</compl_date>
<deal_staff_name>张小茜</deal_staff_name>
<deal_staff_mobile>13905174244</deal_staff_mobile>
<compl_phenom>其他</compl_phenom>
<fault_reason>CA授权问题</fault_reason>
<book_date>null</book_date>
<book_time>null</book_time>
<run_sts>已完成</run_sts>
<deal_log>
<deal_info>
<deal_time>2019-03-08 15:09:51</deal_time>
<deal_type>定单生成</deal_type>
<deal_name>系统</deal_name>
<deal_mobile>null</deal_mobile>
</deal_info>
<deal_info>
<deal_time>2019-03-08 15:57:16</deal_time>
<deal_type>领单</deal_type>
<deal_name>张小茜</deal_name>
<deal_mobile>13905174244</deal_mobile>
</deal_info>
<deal_info>
<deal_time>2019-03-08 15:57:36</deal_time>
<deal_type>回单</deal_type>
<deal_name>张小茜</deal_name>
<deal_mobile>13905174244</deal_mobile>
</deal_info>
</deal_log>
</order_info>
</RETURN_INFO>
</root>
2、java代码为:
public class Demo{
public static void main(String[] args) {
String result_code = "";
String result_Desc = "";
String so_nbr = "";
String appl_date = "";
String compl_date = "";
String deal_staff_name = "";
String deal_staff_mobile = "";
String compl_phenom = "";
String fault_reason = "";
String book_date = "";
String book_time = "";
String run_sts = "";
String cust_id = "";
String deal_time = "";
String deal_type = "";
String deal_name = "";
String deal_mobile = "";
/**
* SAXReader可以直接使用read()方法将一个文件输入流转换成Document对象;而DocumentHelper不能直接操作文件输入流,
* 只能使用parseText()方法将string字符串解析成Document对象,所以必须先将文件输入流写到String字符串中,再由DocumentHelper去解析。
* 如果xml文件过于庞大,就要考虑使用SAX解析了,因为SAX是逐行解析,并不需要等待加载完成就可以马上解析。
*/
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><RETURN_CODE>0</RETURN_CODE><RETURN_DESC>成功!</RETURN_DESC><RETURN_INFO><order_info><so_nbr>7003400</so_nbr><cust_id>0045289</cust_id><appl_date>2019-03-08 15:09:35</appl_date><compl_date>2019-03-08 15:57:35</compl_date><deal_staff_name>张小茜</deal_staff_name><deal_staff_mobile>13905174244</deal_staff_mobile><compl_phenom>其他</compl_phenom><fault_reason>CA授权问题</fault_reason><book_date>null</book_date><book_time>null</book_time><run_sts>已完成</run_sts><deal_log><deal_info><deal_time>2019-03-08 15:09:51</deal_time><deal_type>定单生成</deal_type><deal_name>系统</deal_name><deal_mobile>null</deal_mobile></deal_info><deal_info><deal_time>2019-03-08 15:57:16</deal_time><deal_type>领单</deal_type><deal_name>张小茜</deal_name><deal_mobile>13905174244</deal_mobile></deal_info><deal_info><deal_time>2019-03-08 15:57:36</deal_time><deal_type>回单</deal_type><deal_name>张小茜</deal_name><deal_mobile>13905174244</deal_mobile></deal_info></deal_log></order_info></RETURN_INFO></root>";
List<Map<String, String>> undonelist = new ArrayList<Map<String,String>>();
Map<String, String> map = new HashMap<String, String>();
if (StringUtil.isNotEmpty(xml)) {
//已完成单解析
Document doc = null;
/** 创建一个读取XML文件的对象 用来指向XML文件的输入流
* 这个XML文件其实就是磁盘上的一个物理文件,我需要将它变成JAVA的对象
* 我们知道JAVA的对象是存在内存中的,所以我们就是要将物理的磁盘上的数据拿到内存中
* 那么首先我们是要将文件的内容拿到内存中,然后再内存中进行处理
*/
SAXReader reader = new SAXReader();
try {
//写死的xml,如果是读取文件用下面注释的那个
doc = DocumentHelper.parseText(xml);
//doc = reader.read(new File("D:/new13.xml"));
Element root = doc.getRootElement();
// 获取根节点下的子节点RETURN_CODE
Element code = root.element("RETURN_CODE");
Element desc = root.element("RETURN_DESC");
result_code = code.getText();
result_Desc = desc.getText();
if (result_code != null && "0".equals(result_code)) {
//获取RETURN_INFO节点
Element resultInfo = root.element("RETURN_INFO");
//获取order_info节点
Element orderInfo = resultInfo.element("order_info");
Element sonbr = orderInfo.element("so_nbr");
so_nbr = sonbr.getTextTrim();
Element custid = orderInfo.element("cust_id");
cust_id = custid.getTextTrim();
Element appldate = orderInfo.element("appl_date");
appl_date = appldate.getTextTrim();
Element compldate = orderInfo.element("compl_date");
compl_date = compldate.getTextTrim();
Element deal_staffname = orderInfo.element("deal_staff_name");
deal_staff_name = deal_staffname.getTextTrim();
Element deal_staffmobile = orderInfo.element("deal_staff_mobile");
deal_staff_mobile = deal_staffmobile.getTextTrim();
Element complphenom = orderInfo.element("compl_phenom");
compl_phenom = complphenom.getTextTrim();
Element faultreason = orderInfo.element("fault_reason");
fault_reason = faultreason.getTextTrim();
Element bookdate = orderInfo.element("book_date");
book_date = bookdate.getTextTrim();
Element booktime = orderInfo.element("book_time");
book_time = booktime.getTextTrim();
Element runsts = orderInfo.element("run_sts");
run_sts = runsts.getTextTrim();
//存储到集合
map.put("so_nbr", so_nbr);
map.put("cust_id", cust_id);
map.put("appl_date", appl_date);
map.put("compl_date", compl_date);
map.put("deal_staff_name", deal_staff_name);
map.put("deal_staff_mobile", deal_staff_mobile);
map.put("compl_phenom", compl_phenom);
map.put("fault_reason", fault_reason);
map.put("book_date", book_date);
map.put("book_time", book_time);
map.put("run_sts", run_sts);
//获取deal_log节点
Element deal_log = orderInfo.element("deal_log");
//获取deal_info节点
Element deal_info = deal_log.element("deal_info");
//循环deal_info节点,在deal_log节点下循环
List<Element> dealInfoList = deal_log.elements();
for (Element e : dealInfoList) {
Map<String, String> m = new HashMap<String, String>();
Element dealtime = e.element("deal_time");
deal_time = dealtime.getTextTrim();
Element dealtype = e.element("deal_type");
deal_type = dealtype.getTextTrim();
Element dealname = e.element("deal_name");
deal_name = dealname.getTextTrim();
Element dealmobile = e.element("deal_mobile");
deal_mobile = dealmobile.getTextTrim();
//放入map集合
m.put("deal_time", deal_time);
m.put("deal_type", deal_type);
m.put("deal_name", deal_name);
m.put("deal_mobile", deal_mobile);
//存储到list<map>
undonelist.add(m);
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.info("xml解析异常");
} catch (Exception e) {
e.printStackTrace();
logger.info("其他异常, e: " + e.getMessage());
}
}
System.out.println("result_code = " + result_code);
System.out.println("result_Desc = " + result_Desc);
System.out.println(map);
System.out.println(undonelist);
}
3、运行的结果:
result_code = 0
result_Desc = 成功!
map={compl_date=2019-03-08 15:57:35, book_date=null, deal_staff_name=张小茜, book_time=null, appl_date=2019-03-08 15:09:35, fault_reason=CA授权问题, compl_phenom=其他, cust_id=0045289, run_sts=已完成, deal_staff_mobile=13905174244, so_nbr=7003400}
undonelist=[{deal_name=系统, deal_type=定单生成, deal_mobile=null, deal_time=2019-03-08 15:09:51}, {deal_name=张小茜, deal_type=领单, deal_mobile=13905174244, deal_time=2019-03-08 15:57:16},
{deal_name=张小茜, deal_type=回单, deal_mobile=13905174244, deal_time=2019-03-08 15:57:36}]
4、扩展:
Document document=DocumentHelper.parseText(xmlContent);//获取Document对象
Element root=document.getRootElement();//获取根结点
Element InterBOSS=root.element("InterBOSS");//获取子结点
Element svcCont=InterBOSS.element("SvcCont");//获取子子结点
Element orderInfoReq=svcCont.element("OrderInfoReq");//获取子子子结点
5、try catch
catch异常尽量包含全面,如果只是DocumentException异常只会捕获解析异常,非解析异常不会捕获并抛出,下面的代码也就不会执行
6、xml拼接
//把数据封装成xml
StringBuilder builder = new StringBuilder();
builder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
builder.append("<root>");
builder.append("<ext_system>").append(ext_system).append("</ext_system>");
builder.append("<cust_id>").append(cust_id).append("</cust_id>");
builder.append("<query_type>").append(query_type).append("</query_type>");
builder.append("<so_cat>").append(so_cat).append("</so_cat>");
builder.append("<area_id>").append(area_id).append("</area_id>");
builder.append("</root>");