XML建模

什么是XML建模

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

XML建模的思路

  1. 根据XML配置文件元素节点创建元素节点实体类
  2. 利用dom4j + xpath 技术实现建模

XML建模的步骤(以config.xml为例)

  1. 分析xml文件config.xml
    1. config节点下有多个子action节点,无节点属性,包含0~n个action标签
    2. action节点有多个forward节点,有节点属性,action标签:可以包含0~N个forward标签     path:以/开头的字符串,并且值必须唯一 非空   type:字符串,非空
    3. forward节点下没有子节点 ,有节点属性 
      1. name:字符串同一action标签下的forward标签name属性值不能 
      2. path : 以/开头的字符串
      3. redirect :只能false|true,允许为空,默认值为false
  2. 根据XML中元素节点的情况(DTD) 来定义ConfigModel、ActionModel、ForwardModel对象模型
    1. config 节点------->configModel对象      
      1. 属性:无
      2. 行为 : 在集合中增加ActionModel对象,通过path找到对应的ActionModel对象
    2. action节点------->ActionModel对象
      1. 属性:path ,type 
      2. 行为 : 在集合中添加ForwardModel对象,通过name找到对应的ForwardModel对象
    3. forward节点-------->ForwardModel对象
      1. 属性: name 、path、redirect
      2. 行为:无
    4. 使用Map集合存放节点元素,其中key为节点唯一属性,value为整个子节点对象
    5. 利用工厂模式 + dom4j + xpath解析Xml配置文件

 XML建模的代码实现思路

  1. 获取io流
  2. 创建xml读取工具类SaxReader对象
  3. 读取config.xml文件,获取document对象
  4. 通过document对象中的selectNodes()方法找到action节点
  5. 遍历action节点,获取action节点中的path、type属性值,并设置ActionModel对象中
  6. 通过document找到该action节点下forward节点
  7. 表里forward节点、获取forward节点中的name、path、redirect属性值,并设置到ForwardModel对象中
  8. 将fordaerModel对象设置到ActionModel中的map集合中,以name属性值为键,属性为值
  9. 将actionMode对象放到ConfigModel对象中,完成建模

        config.xml文件

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



	<!--
		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>

        将有子节点并且子节点有属性 那这个有子节点的这个实体类 可加俩方法 (用来将子节点的 实体类对象放到父节点的map集合中) 如下:

forward是action的子节点 该实体类的两个方法

 

 

 

 

    //静态方法	
    public static ConfigModel  createConfiModel(String path) {
		
		
		ForwardModel fm=null;
		ActionModel am=null;
		ConfigModel cm = new ConfigModel();
		
		InputStream is = ConfigModelFactory.class.getResourceAsStream("/config");
		
		//2.获取Saxreader 读取器对象
		SAXReader rs=new SAXReader();
		try {
			//3.读取配置文件,获取document对象
			Document read = rs.read(is);
			//4.使用xpath解析
			List<Node> actionNodes = read.selectNodes("/config/action");
			
			//5.遍历action节点取出path、type属性值
			for (Node actionNode : actionNodes) {
				//没有属性值  必须转换成Element
				Element actionel=(Element)actionNode;
				//取属性值
				String actionpath = actionel.attributeValue("path");
				String actiontype = actionel.attributeValue("type");
				
				//给ActionModel对象属性设置值
				am =new ActionModel();
				
				
				am.setPath(actionpath);
				am.setType(actiontype);
				
				
				//取action标签下的子标签forward 
				List<Node> forwardNodes = actionNode.selectNodes("forward");
				
				//遍历取forward的name、path、属性值
				for (Node forwardNode : forwardNodes) {
					//没有属性值需要转换成Element 
					Element forwardel=(Element)forwardNode;
					//取属性值
					String forwardname = forwardel.attributeValue("name");
					String forwardpath = forwardel.attributeValue("path");
					String redirect = forwardel.attributeValue("redirect");
					
					//设置forwardModel对象中的属性
					fm = new ForwardModel();
					
					fm.setName(forwardname);
					fm.setPath(forwardpath);
					fm.setRedirect(Boolean.parseBoolean(redirect));
					
					//  将action下的forward对象增加到ActionModel中的map集合中
					am.put(fm);
				}
				
				//将action对象增加到ConfigModel对象中的amp集合中
				cm.put(am);
				
			}
			
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		
		return cm;
	}
	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值