网博开发者社区

 找回密码
 立即注册
搜索
查看: 554|回复: 1

commons-digester解析xml

[复制链接]

8

主题

9

帖子

142

积分

老师

积分
142
发表于 2019-4-25 12:46:27 | 显示全部楼层 |阅读模式
在解析xml的时候,我们可以选择的方式有很多
其中digester解析是将XML转换成Java对象来实现了
那么该如何进行转换呢?
以下述的xml为例


此时可以将其转换成三个对象来实现
ActionMappings.java
package config;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

public class ActionMapping implements Serializable {

    private Map<String,Action> actions = new HashMap<String,Action>();

    public void addAction(Action action){
        actions.put(action.getPath(),action);
    }

    public Action findAction(String path){
        return actions.get(path);
    }

    public Map<String, Action> getActions() {
        return actions;
    }

    public void setActions(Map<String, Action> actions) {
        this.actions = actions;
    }
}

Action.java
package config;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

public class Action implements Serializable {
    private String path;
    private String type;
    private String parameter;
    private Map<String,Forward> forwards = new HashMap<String,Forward>();

    public void addForward(Forward forward){
        forwards.put(forward.getName(),forward);
    }

    public Forward findForward(String name){
        return forwards.get(name);
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getParameter() {
        return parameter;
    }

    public void setParameter(String parameter) {
        this.parameter = parameter;
    }

    public Map<String, Forward> getForwards() {
        return forwards;
    }

    public void setForwards(Map<String, Forward> forwards) {
        this.forwards = forwards;
    }
}
Forward.java

package config;

import java.io.Serializable;

public class Forward implements Serializable {
    private String name;
    private String path;
    private boolean redirect;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public boolean isRedirect() {
        return redirect;
    }

    public void setRedirect(boolean redirect) {
        this.redirect = redirect;
    }
}

通过rule.xml文件将需要解析的xml中的标签与Java对象进行映射

<?xml version="1.0" encoding="UTF-8"?>
<pattern value="action-mappings">
    <pattern value="action">
        <object-create-rule classname="config.Action"></object-create-rule>
        <set-properties-rule></set-properties-rule>
        <set-next-rule methodname="addAction"></set-next-rule>
        <pattern value="forward">
            <object-create-rule classname="config.Forward"></object-create-rule>
            <set-properties-rule></set-properties-rule>
            <set-next-rule methodname="addForward"></set-next-rule>
        </pattern>
    </pattern>
</pattern>

此时可以对xml进行解析
测试类:
package test;

import config.ActionMapping;
import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;
import org.xml.sax.SAXException;
import parser.DigesterParser;

import java.io.IOException;

public class Test {

    public static void main(String[] args) {
        //将xml转换成java,同时返回解析器
        Digester digester = DigesterLoader.createDigester(DigesterParser.class.getClassLoader().getResource("config/rule.xml"));

        //将一个java对象交给解析器,作为根对象
        ActionMapping actionMapping = new ActionMapping();
        digester.push(actionMapping);

        //解析
        try {
            digester.parse(DigesterParser.class.getClassLoader().getResourceAsStream("actions.xml"));
            System.out.println(actionMapping.findAction("/login").findForward("success").getPath());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }

    }
}



回复

使用道具 举报

7

主题

10

帖子

34

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
34
发表于 2019-4-28 11:28:41 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|网博开发者社区 ( 苏ICP备05021715号-1 )

GMT+8, 2018-5-27 04:16 , Processed in 0.082762 second(s), 26 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表