dom4j解析xml

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>");

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值