Java XML解析工具类

Java XML解析工具类

  • Java解析XML的方式有很多,这里不一一说明了,利用三方jar包,实现了一个XML工具类
  • 本身是有个需求,讲三方公司的XML请求文件中的Response里的属性赋值成java对象,没做完不需要了,只做到了解析,后续本来想利用解析出来的key进行遍历,利用FTL模板生成Java文件,有这个需求的小伙伴可以延续这个工具类。

1. 看看XML

<?xml version="1.0" encoding="utf-8"?>
<!--每个协议有Request或Response两个节点,说明一个是请求,另一个假如请求成功,则返回相应结果 -->
<!-- 在请求时无Response节点,同样在返回时也没有Request节点-->
<Body >

  <Request OrgCode='' OperType='1'>

    <UserN></UserN>
   
    <PassWord></PassWord>
  </Request>
  <!--ErrMsg:如果错误则此处是错误信息(如节点无效或条件不足等),不可预料错误则以Err开头,以及Response节点下不能有子节点 -->
  <!--对于查询确实无符合条件的,则ErrMsg应该为空,只不过Response节点无子节点 -->
  <Response ErrMsg=''>
  
    <UserID>111</UserID>
    
    <UserName></UserName>
   
    <DoctorID></DoctorID>
    
    <DoctorName></DoctorName>
   
    <Province ID=''></Province>
  
    <City ID=''></City>
   
    <District ID=''></District>
    
    <Street ID=''></Street>
   
    <EmployeeNo ID=''></EmployeeNo>
   
    <RoleCD></RoleCD>
   
    <Zones>
      <Zone ID=''></Zone>
    </Zones>
  </Response>
</Body>


2. 看看Java代码

  1. 引入pom
    <!--解析xml报文-->
    	<dependency>
    		<groupId>dom4j</groupId>
    		<artifactId>dom4j</artifactId>
    		<version>1.6.1</version>
    	</dependency>
    	<dependency>
    		<groupId>jaxen</groupId>
    		<artifactId>jaxen</artifactId>
    		<version>1.1-beta-6</version>
    	</dependency>
    
  2. Java
    
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    import org.apache.commons.lang3.StringUtils;
    import org.dom4j.Attribute;
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    import java.io.*;
    import java.util.*;
    
    /**
     * xml 解析
     *
     * @author 如漩涡
     * @date 2021/6/10
     */
    public class XmlUtil {
        /**
         * XML节点转换JSON对象
         *
         * @param element 节点
         * @param object  新的JSON存储
         * @return JSON对象
         */
        private static JSONObject xmlToJson(Element element, JSONObject object) {
            List<Element> elements = element.elements();
            for (Element child : elements) {
                Object value = object.get(child.getName());
                Object newValue;
    
                if (child.elements().size() > 0) {
                    JSONObject jsonObject = xmlToJson(child, new JSONObject(true));
                    if (!jsonObject.isEmpty()) {
                        newValue = jsonObject;
                    } else {
                        newValue = child.getText();
                    }
                } else {
                    newValue = child.getText();
                }
    
                List<Attribute> attributes = child.attributes();
                if (!attributes.isEmpty()) {
                    JSONObject attrJsonObject = new JSONObject();
                    for (Attribute attribute : attributes) {
                        attrJsonObject.put(attribute.getName(), attribute.getText());
                        attrJsonObject.put("content", newValue);
                    }
                    newValue = attrJsonObject;
                }
    
                if (newValue != null) {
                    if (value != null) {
                        if (value instanceof JSONArray) {
                            ((JSONArray) value).add(newValue);
                        } else {
                            JSONArray array = new JSONArray();
                            array.add(value);
                            array.add(newValue);
                            object.put(child.getName(), array);
                        }
                    } else {
                        object.put(child.getName(), newValue);
                    }
                }
            }
            return object;
        }
    
        /**
         * XML字符串转换JSON对象
         *
         * @param xmlStr XML字符串
         * @return JSON对象
         */
        public static JSONObject xmlToJson(String xmlStr) {
            JSONObject result = new JSONObject(true);
            SAXReader xmlReader = new SAXReader();
            try {
                Document document = xmlReader.read(new StringReader(xmlStr));
                Element element = document.getRootElement();
                return xmlToJson(element, result);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
    
        /**
         * XML文件转换JSON对象
         *
         * @param file 文件路径
         * @param node 选择节点
         * @return JSON对象
         */
        public static JSONObject xmlToJson(File file, String node) {
            JSONObject result = new JSONObject(true);
            SAXReader xmlReader = new SAXReader();
            try {
                Document document = xmlReader.read(file);
                Element element;
                if (StringUtils.isBlank(node)) {
                    element = document.getRootElement();
                } else {
                    element = (Element) document.selectSingleNode(node);
                }
                return xmlToJson(element, result);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
    
    	public static void main(String[] args) {
    		System.out.println(xmlToJson(new File("C:\\Users\\如漩涡\\Desktop\\PAD\\1 用户登录验证.xml"), "Body/Response"));
    	}
    
    }
    
package com.hexiang.utils; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; /** * 本类是专门解析XML文件的,主要用于为系统读取自己的配置文件时提供最方便的解析操作 * @author HX * */ public class XmlManager { /** * 得到某节点下某个属性的值 * @param element 要获取属性的节点 * @param attributeName 要取值的属性名称 * @return 要获取的属性的值 * @author HX_2010-01-12 */ public static String getAttribute( Element element, String attributeName ) { return element.getAttribute( attributeName ); } /** * 获取指定节点下的文本 * @param element 要获取文本的节点 * @return 指定节点下的文本 * @author HX_2010-01-12 */ public static String getText( Element element ) { return element.getFirstChild().getNodeValue(); } /** * 解析某个xml文件,并在内存中创建DOM树 * @param xmlFile 要解析的XML文件 * @return 解析某个配置文件后的Document * @throws Exception xml文件不存在 */ public static Document parse( String xmlFile ) throws Exception { // 绑定XML文件,建造DOM树 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document domTree = db.parse( xmlFile ); return domTree; } /** * 获得某节点下的某个子节点(指定子节点名称,和某个属性的值) * 即获取parentElement下名字叫childName,并且属性attributeName的值为attributeValue的子结点 * @param parentElement 要获取子节点的那个父节点 * @param childName 要获取的子节点名称 * @param attributeName 要指定的属性名称 * @param attributeValue 要指定的属性的值 * @return 符合条件的子节点 * @throws Exception 子结点不存在或有多个符合条件的子节点 * @author HX_2008-12-01 */ public static Element getChildElement( Element parentElement, String childName, String attributeName, String attributeValue ) throws Exception { NodeList list = parentElement.getElementsByTagName( childName ); int count = 0; Element curElement = null; for ( int i = 0 ; i < list.getLength() ; i ++ ) { Element child = ( Element )list.item( i ); String value = child.getAttribute( attributeName ); if ( true == value.equals( attributeValue ) ) { curElement =
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值