欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDom解析xml文件

程序员文章站 2022-05-28 11:44:14
...

情景

解析xml配置文件,将数据库列名和Bean的属性映射。

jar包下载地址

DOM:jdk自带
标准的xml解析方式,树形加载整个xml,不适合大文件。

SAX:http://sourceforge.net/projects/sax/
事件模型xml解析方式,不需要完全加载xml,相较性能更好。

JDOM:http://jdom.org/downloads/index.html
针对java的Dom解析。

DOM4J:http://sourceforge.net/projects/dom4j/
针对java功能强大的xml解析,能够处理大文件,性能也很好,但是很复杂。

xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<mapper name="vo.UserInfo">
    <property dbName="USER_NAME|user_name" fName="userName"/>
    <property dbName="ARCHIVE_ID|archive_id" fName="archiveID"/>
    <property dbName="USER_MOBILE|user_mobile" fName="userMobile"/>
    <property dbName="DEPT_NAME|dept_name" fName="userDept"/>
</mapper>

解析xml

注意: 开始解析之前一定要记着导jar包。

/**
 * JDom解析xml文件工具类
 *
 * @author fengzhen
 * @version v1.0, 2017/9/5 11:07
 */
public class JDomUtils {

    /**
     * 解析mapper类型xml文件
     *
     * @author fengzhen
     * @version v1.0, 2017/9/5 11:10
     */
    public static List<Map<String, String[]>> parseMapperAll(String fileName) throws JDOMException, IOException {
        ArrayList<Map<String, String[]>> result = new ArrayList<>();

        // 创建解析器build对象
        SAXBuilder saxBuilder = new SAXBuilder();
        // 读取xml对象
        Document userMapper = saxBuilder.build(new File("src/mapper/" + fileName));
        // 获取根节点
        Element rootElement = userMapper.getRootElement();
        // 获取根节点下所有自己节点
        List<Element> propertys = rootElement.getChildren("property");

        for (Element property :
                propertys) {
            HashMap<String, String[]> element = new HashMap<>();
            // 解析属性名
            String fName = property.getAttributeValue("fName");
            element.put("fName", new String[]{fName});
            // 解析数据库名 可能存在别名
            String dbName = property.getAttributeValue("dbName");
            element.put("dbName", dbName.split("\\|"));
            result.add(element);
        }
        return result;
    }

    /**
     * 解析mapper类型xml文件
     *
     * @author fengzhen
     * @version v1.0, 2017/9/5 11:10
     */
    public static String parseMapperModel(String fileName) throws JDOMException, IOException {

        // 创建解析器build对象
        SAXBuilder saxBuilder = new SAXBuilder();
        // 读取xml对象
        Document userMapper = saxBuilder.build(new File("src/mapper/" + fileName));
        // 获取根节点
        Element rootElement = userMapper.getRootElement();
        return rootElement.getAttributeValue("name");
    }

结果展示

调用解析方法解析文件

try {
     List<Map<String, String[]>> maps = JDomUtils.parseMapperAll("UserMapper.xml");
     for (Map<String, String[]> map :
             maps) {
         System.out.println("dnName:"+map.get("dbName")[0]+" fName:"+map.get("fName")[0]);
     }
 } catch (JDOMException | IOException e) {
     e.printStackTrace();
 }

结果:为了简单,这里只取第一个值,别名没有进行展示

dnName:USER_NAME  fName:userName
dnName:ARCHIVE_ID  fName:archiveID
dnName:USER_MOBILE  fName:userMobile
dnName:DEPT_NAME  fName:userDept