1.什么叫XML建模
将XML配置文件中的元素、属性、文本信息转换成对象的过程叫做XML建模
2. XML建模
1)根据XML配置文件元素节点创建元素节点实体类
ConfigModel、ActionModel、ForwardModel
2)利用dom4j+xpath技术实现XML建模
ConfigModelFactory
DTD约束:由XML的根节点往里建立约束
XML建模:由最里层节点往根节点进行建模,一个元素节点代表一个实体类
一.xml建模之实体层面的关联关系建立
package com.zking.entity;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* ConfigModel实体类对应config.xml中config节点所建立建模实体类
* <config>-> ConfigModel
* <action>-> ActionModel
* <forward>-> ForwardModel
* 包含关系:ConfigModel -> ActionModel
* 特点:在config节点包含0~N个节点,而action节点的path属性唯一
* @author Administrator
*
*/
public class ConfigModel implements Serializable {
private Map<String,ActionModel>actions =new HashMap<>();
/**
* 取值
* @param path action节点所对应的path属性,唯一
* @return
*/
public ActionModel get(String path) {
return actions.get(path);
}
/**
* 存值
* @param action 根据action中的path属性作为key,以整个action节点作为value值
*/
public void push(ActionModel action) {
actions.put(action.getPath(),action);
}
}
二.xml建模之综合案例演示
public static ConfigModel createConfigModel(String path) {
//目标:使用dom4j+path技术完成XML解析建模操作
ConfigModel configModel =new ConfigModel();
ActionModel actionModel =null;
ForwardModel forwardModel =null;
try {
//1.获取文件输入流
InputStream is =ConfigModelFactory.class.getResourceAsStream(path);
//2.创建SAXReader对象
SAXReader saxReder =new SAXReader();
//3.读取文件输入流并转换成Document对象
Document doc = saxReder.read(is);
//4.解析XML文件
//1)获取多个节点:sectNodes
//2)获取单个节点:selectSingleNode
//3)xpath语法:/代表定位路径 @代表获取属性
List<Node>actionNodes =doc.selectNodes("/config/action");
//循环遍历action接点
for (Node action : actionNodes) {
//5.将action节点转换成元素节点
Element actionElem =(Element) action;
//6.获取action节点中的属性(path和type)
String actionPath =actionElem.attributeValue("path");
String actionType =actionElem.attributeValue("type");
//7.初始值ActionModel 并完成建模赋值操作
actionModel =new ActionModel();
actionModel.setPath(actionPath);
actionModel.setType(actionType);
//8.获取action节点下的forward节点(0~N)
List<Node>forwardNodes =actionElem.selectNodes("forward");
//9.循环遍历所有的forward节点
for (Node forward : forwardNodes) {
//10.将forward节点转换成元素节点
Element forwardElem =(Element) forward;
//11.获取forward节点中所有属性(name,path,以及redirect)
String forwardName =forwardElem.attributeValue("name");
String forwardPath =forwardElem.attributeValue("path");
String forwardRedirect =forwardElem.attributeValue("redirect");
//12.创建forwardMdel创建对象并完成赋值操作
forwardModel =new ForwardModel();
forwardModel.setName(forwardName);
forwardModel.setPath(forwardPath);
forwardModel.setRedirect(Boolean.parseBoolean(forwardRedirect));
//13.action节点包含0~nforward节点,所有请将forward节点的建模对象添加到action中
actionModel.push(forwardModel);
//14.config节点中包含0~N个action节点,所有请将action节点的建模对象添加到forward中
configModel.push(actionModel);
}
}
}catch (Exception e) {
e.printStackTrace();
}
return configModel;
}
public static void main(String[] args) {
ConfigModel configModel = ConfigModelFactory.createConfigModel();
//包含关系:ConfigModel -> ActionModel -> ForwaedModel
ActionModel actionModel =configModel.get("/loginAction");
System.out.println("action节点path属性:"+actionModel.getPath());
System.out.println("action节点path属性:"+actionModel.getType());
//要求:从config节点获取action节点的name属性为/loginAction的节点
ForwardModel forwardModel =actionModel.get("success");
System.out.println("forward节点name属性:"+forwardModel.getName());
System.out.println("forward节点name属性:"+forwardModel.getPath());
System.out.println("forward节点name属性:"+forwardModel.isRedirect());
}
}