XML 解析与XMl建模

这篇博客介绍了Java中XML文件的四种类型及其存放位置,重点讲解了XML的解析和建模。通过DOM4J库和XPath解析XML文件,展示了一个示例代码。接着,博主展示了如何将XML配置文件转换为实体类,创建了ConfigModel、ActionModel和ForwardModel,并提供了建模方法。最后,给出了一个测试用例,成功展示了XML配置文件的建模结果。
摘要由CSDN通过智能技术生成

一.XML 解析

1.在Java中的配置文件有四类:

*.xml

*.properties  

*.ini                 

*.yaml/*.yml

它们的存放位置(以及获取方式)

 src根目录下

  

Xxx.class.getResourceAsStream("/config.properties");

与读取配置文件的类在同一包

 Xxx.class.getResourceAsStream("config2.properties");

 WEB-INF(或其子目录下)  

ServletContext application = this.getServletContext();

 InputStream is =application.getResourceAsStream("/WEB-INF/config3.properties");
  1. XML的作用:

 配置

     *.properties

     *.xml

     *.ini

     *.yaml/*.yml

 数据交换

     xml

       webservice

     json

  1. 使用dom4j+xpath   jar包解析xml文件
public class Demo02 {

    public static void main(String[] args) {
        //获取文件的io流
        InputStream inputStream = Demo02.class.getResourceAsStream("/students.xml");
        //创建SaxReader对象 读取器对象
        SAXReader saxReader = new SAXReader();
        try {
            //3.读取配置文件 ,获取Document对象
            Document document = saxReader.read(inputStream);
            //4.使用xpath解析document对象
            List<Node> student = document.selectNodes("/students/student");
//            System.out.println(student.size());
            for (Node node : student) {
                //找到name节点
                Node name = node.selectSingleNode("name");
                //获取name节点中文本信息
                String nameText = name.getText();
//                System.out.println(nameText);
                //节点没有属性值,获取不了
                //节点的属性值需要将节点转换成Element 元素对象
                Element element = (Element) node;
                String sid = element.attributeValue("sid");
                System.out.println(sid);

            }
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }

    }
}

 

二.XMl建模

在掌握了XML解析的前提下进行建模:

将XML配置文件中的元素、属性、文本信息转换成对象的过程叫做XML建模

 

我有一个config.xml 文件,它的存放位置在src下

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE config[

<!ELEMENT config (action*)>

<!ELEMENT action (forward*)>

<!ELEMENT forward EMPTY>

<!ATTLIST action

path CDATA #REQUIRED

type CDATA #REQUIRED

>

<!ATTLIST forward

name CDATA #REQUIRED

path CDATA #REQUIRED

redirect (true|false) "false"

>

]>

<!--

config标签:可以包含0~N个action标签

-->

<config>

<!--

action标签:可以饱含0~N个forward标签

path:以/开头的字符串,并且值必须唯一 非空

type:字符串,非空

-->

<action path="/regAction" type="test.RegAction">

<!--

forward标签:没有子标签;

name:字符串,同一action标签下的forward标签name值不能相同 ;

path:以/开头的字符串

redirect:只能是false|true,允许空,默认值为false

-->

<forward name="failed" path="/reg.jsp" redirect="false" />

<forward name="success" path="/login.jsp" redirect="true" />

</action>



<action path="/loginAction" type="test.LoginAction">

<forward name="failed" path="/login.jsp" redirect="false" />

<forward name="success" path="/main.jsp" redirect="true" />

</action>

</config>

由文件可知,其有三个标签,且关系为:

Node1:config{Node2:action{Node3:forword}}

根据它们的属性特性,我们可以创建实体类ConfigModel、ActionMode、ForwardModel

根据它们的关系,我们可以在类中创建put()和get()方法

比如ActionMode和ForwardModel

public class ForwardModel implements Serializable {

    private  String name;

    private  String path;

    private boolean redirect;



    public ForwardModel() {

    }



    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;

    }



    @Override

    public String toString() {

        return "ForwardModel{" +

                "name='" + name + '\'' +

                ", path='" + path + '\'' +

                ", redirect=" + redirect +

                '}';

    }

}

public class ActionModel implements Serializable {

    private String path;

    private String type;

    private Map<String,ForwardModel> Fw =new HashMap<String,ForwardModel>();



    public ActionModel() {

    }



    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 Map<String, ForwardModel> getFw() {

        return Fw;

    }



    public void setFw(Map<String, ForwardModel> fw) {

        Fw = fw;

    }



    @Override

    public String toString() {

        return "ActionModel{" +

                "path='" + path + '\'' +

                ", type='" + type + '\'' +

                ", Fw=" + Fw +

                '}';

    }

    /*

    将forwardmodel对象存入Actionmodel的map集合

    以forwardmodel的name作为键

    对象作为值



     */



    public void put (ForwardModel forwardModel){

        this.Fw.put(forwardModel.getName(),forwardModel);

    }



    /*

     * 通过Forwardmodel的name属性取得forwordmodel对象

     * @param name forwordmodel的name属性

     * @return forwordmodel对象

     */

    public ForwardModel get (String name){

        return this.Fw.get(name);

    }

}

开始解析建模:

load .......

public class ConfigModelFactory {

    //配置文件默认路径

    public static final  String DEFAULT_PATH ="/config.xml";



  /*  //实例方法 对象名.test

    public void  test(){



    }



    *//**

     * 私有构造方法 外部不可调用

     *//*

    private ConfigModelFactory() {





    }*/



    /**

     * 建模方法

     * @param path 文件路径

     * @return

     */

     public static ConfigModel createConfigmodel(String path){

       //获得文件io流

         InputStream inputStream = ConfigModelFactory.class.getResourceAsStream(path);

        /* System.out.println(inputStream);*/

        //创建读取器对象Sax

         SAXReader saxReader = new SAXReader();

         /*定义变量*/

         String  actionpath = null;

         String  actiontype = null;

         ActionModel actionModel=null;





         String forwardname=null;

         String forwardpath=null;

         String forwardredirect=null;

         ForwardModel forwardModel = null;





         ConfigModel configModel=new ConfigModel();

         try {

             //创建配置文件,生成document对象

             Document document = saxReader.read(inputStream);

             //开始解析

             List<Node> actionnodes = document.selectNodes("/config/action");

             for (Node actionnode : actionnodes) {

                 //对象转换

                 Element actionelment =(Element) actionnode;

               /*获取action中的path和type属性值*/

                 actionpath = actionelment.attributeValue("path");

                 actiontype = actionelment.attributeValue("type");

                 /* 实例化actionmodel对象*/

                 actionModel=new ActionModel();

                 //将属性赋入对象

                 actionModel.setPath(actionpath);

                 actionModel.setType(actiontype);



                 //获取该action下的forward标签

                 List<Node> forwardnodes = actionnode.selectNodes("forward");

                //遍历forword标签 转换对象

                 for (Node forwardnode : forwardnodes) {

                     Element forwardelment = (Element) forwardnode;

                     forwardname = forwardelment.attributeValue("name");

                     forwardpath = forwardelment.attributeValue("path");

                     forwardredirect = forwardelment.attributeValue("redirect");

                     //实例化forwardmodel对象

                     forwardModel =new ForwardModel();

                     //将属性赋入对象

                     forwardModel.setName(forwardname);

                     forwardModel.setPath(forwardpath);

                     forwardModel.setRedirect(Boolean.parseBoolean(forwardredirect));

                     //将forwardmodel对象放入action对象集合

                     actionModel.put(forwardModel);



                 }



                configModel.put(actionModel);

             }

             return  configModel;

         } catch (DocumentException e) {

             throw new RuntimeException(e);

         }



     }



    /**

     * 建模方法重载

     * @return

     */

    public static ConfigModel createConfigmodel(){

        return  createConfigmodel(DEFAULT_PATH);

    }

在写一个main方法测试

 public static void main(String[] args) {



        ConfigModel configmodel = createConfigmodel();

        ActionModel actionModel = configmodel.get("/regAction");



        System.out.println(actionModel);



}

 结果:

ActionModel{path='/regAction', type='test.RegAction', Fw={success=ForwardModel{name='success', path='/login.jsp', redirect=true}, failed=ForwardModel{name='failed', path='/reg.jsp', redirect=false}}}

没毛病。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想余生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值