XML解析

Posted sora-l

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML解析相关的知识,希望对你有一定的参考价值。

<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>

 

 

使用dom4j解析xml

通过反射,如果自己能够创建好Vo文件

技术图片

 

 对应XML文件中的节点

技术图片

 

 

 

public FaultReportVo readHdrXml(String url) throws Exception {
        //xml文件路径
        String inputUrl = url + ".HDR";
        SAXReader reader = new SAXReader();
        // 加载dom对象
        Document document = reader.read(new File(inputUrl));
        // 获取根节点
        Element rootElement = document.getRootElement();
        //节点对应的vo的包地址
        String rootPackageUrl = "cn.com.liandisys.gzlb.vo.hdr";
        return (FaultReportVo)ReadXmlUtil.reflectNewInstance(rootPackageUrl,rootElement);
    }



package cn.com.liandisys.gzlb.common.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Element;
/**
 * XML解析
 * @author MrLu
 *
 */
public class ReadXmlUtil {

    /**
     * 创建节点对象
     * @param packageUrl 节点对应的包地址   cn.com.liandisys.gzlb.vo.hdr
     * @param element 节点对象
     * @return
     * @throws Exception
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static Object reflectNewInstance(String packageUrl, Element element)
            throws Exception {
        Class<?> newClass = Class
                .forName(packageUrl+"." + element.getName() + "Vo");
        Object classSta = newClass.newInstance();
        Iterator iterator = element.elementIterator();
        while (iterator.hasNext()) {
            Element el = (Element) iterator.next();
            Object obj = null;
            if (el.elementIterator().hasNext()) {
                obj = reflectNewInstance(packageUrl, el);
            }
            // 获取所有字段
            Field[] fields = newClass.getDeclaredFields();
            for (Field field : fields) {
                if (field.getName().toUpperCase()
                        .contains(el.getName().toUpperCase())) {
                    // 判断是否是List<?>类型
                    if (field.getType().isAssignableFrom(List.class)) {
                        // 获取List中的类型
                        Type fc = field.getGenericType();
                        // 如果是当前的对象类型
                        if (fc instanceof ParameterizedType) {
                            if (!field.isAccessible()) {
                                field.setAccessible(true);
                            }
                            ParameterizedType pt = (ParameterizedType) fc;
                            // 获取list对象集合的实例类型
                            Class genericClazz = (Class) pt
                                    .getActualTypeArguments()[0];
                            // 转换为List<?>中的泛型对象
                            Method getMethod = newClass.getMethod("get"
                                    + getFirstUpper(field.getName()));
                            Method setMethod = newClass.getMethod("set"
                                    + getFirstUpper(field.getName()),
                                    List.class);
                            // 先获取List
                            List list = (List) getMethod.invoke(classSta);
                            if (list == null) {
                                list = new ArrayList<Object>();
                            }
                            list.add(genericClazz.cast(obj));
                            setMethod.invoke(classSta, list);
                        }
                    } else if (field.getType() == String.class) {
                        Method method = newClass.getDeclaredMethod("set"
                                + getFirstUpper(field.getName()), String.class);
                        method.invoke(classSta, el.getStringValue());
                    }
                }
            }
        }
        if (classSta != null) {
            return classSta;
        }
        return null;
    }

    // 首字母大写
    private static String getFirstUpper(String str) {
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }

}

 

以上是关于XML解析的主要内容,如果未能解决你的问题,请参考以下文章

无法解析片段中的 findViewById [重复]

jsoup解析xml某片段的问题

为 Blogger 上的博客格式化代码片段 [关闭]

java解析xml的几种方式哪种最好?

使用非utf-8编码在Python中解析XML

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途