XML建模

前言

XML建模是指使用标记语言XML来描述数据模型的过程。XML使用标记、元素和属性来描述数据模型,可以把一个复杂的数据模型表示成更加容易理解和可读的形式,便于人们进行交流和数据处理。

在XML建模中,通过定义XML元素和属性的组合,可以描述数据实体的属性和关系。XML建模通常使用文本编辑器或者XML编辑器来完成,通过定义DTD(文档类型定义)或XML Schema来规定XML文档的结构和内容,使得不同的系统或应用之间能够相互交流和共享数据。

XML建模通常应用于数据交换、服务描述、文档生成等领域,可以方便地进行数据转换和数据集成。同时,XML建模也是许多Web服务和服务导向架构(SOA)的基础技术之一。


目录

XML建模的思路

分析

建模

获取文件初始化模型对象

弹栈,拿到指定值

总结

使用map集合存储

使用list集合存储


XML建模的思路

  • 分析需要被建模的文件中有那几个对象
  • 每个对象拥有的行为以及属性
  • 定义对象从小到大(从里到外)
  • 通过23种的设计模式中的工厂模式,解析xml生产出指定对象

以下面的代码为例子

<?xml version="1.0" encoding="UTF-8"?>
<config>
	<action path="/regAction" type="test.RegAction">
		<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>

上面是一段xml语言

分析

我们分析可以得知

这其中,最大的标签是config,在config之中,又有两个action,在action中,还有两个for word

,并且action中的还有两个属性,forward中有三个属性

所以分析得知,这段xml语言我们需要建立三个模型对象

  • forwardmodel
  • actionmodel
  • configmodel

建模

现在我们开始建模

建模是由小往大建的

ForwardModel

package com.wenhao.xml;

public class ForwardModel {

	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;
	}
	
	
	
}

forward标签中的三个属性,对应着我们模型对象中也要创建三个属性

ActionModel

package com.wenhao.xml;

import java.util.HashMap;
import java.util.Map;

public class ActionModel {

	private String path;
	private String type;
	private Map<String, ForwardModel> map= new HashMap<String, ForwardModel>();
	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 void push(ForwardModel f) {
		map.put(f.getName(), f);
	}
	//根据名字拿到这个集合中forward标签
	public ForwardModel pop(String name) {
		return map.get(name);
	}
	
	
}

因为acion中包含了forward标签,而forward中的属性,与标签是一对一的关系,也就是键值对的关系,所以我们用map集合定义,而因为action中包含了forward,所以我们需要有一个增加和查询的行为,方便以后我们通过代码获取到其中的xml元素

config标签

package com.wenhao.xml;

import java.util.HashMap;
import java.util.Map;

public class ConfigModel {
	
	private Map<String , ActionModel> map= new HashMap<String, ActionModel>();

	//压栈的行为
	public void push(ActionModel actionmodel) {
		map.put(actionmodel.getPath(), actionmodel); 
	}
	
	//弹栈的行为
	public ActionModel  pop(String path) {
		return map.get(path);
	}
	
	
}

同理,因为config没有属性,所以我们定义模型对象就没有对应的属性,但是config包含了action,所以我们定义action集合

//这里解释一下,压栈和弹栈的行为,因为标签中是有属性的嘛,所以我们可以且属性和标签是一对一的关系,所以此时我们只需要将属性作为键,因为是唯一的,将对象作为值放到map集合中,就可以保存下来啦

获取文件初始化模型对象

接下来,我们通过xml建模语言来完成一个小小的要求,拿到第二个action中的第二个forward中的path值

首先,要初始化我们的建模对象,将xml中的内容放到我们的jianmo对象中


	//写一个创建模型的方法
	public static ConfigModel build(String path) throws Exception {
		ConfigModel con= new ConfigModel();
		//抓取到xml配置文件
		InputStream in = test_01.class.getResourceAsStream(path);
		SAXReader s= new SAXReader();
		Document read = s.read(in);
	//拿到配置文件的信息,并且打印
//		System.out.println(read.asXML());
		//接下来拿到所有的config下的所有的action文件
		List<Element> selectNodes = read.selectNodes("config/action");
		
		for (Element selectNode : selectNodes) {
			//拿到每一个action的值并且打印
//			System.out.println("+++++++++++++++++++++++++++++");
//		System.out.println(selectNode.asXML());
		//获取action中的path值和type值
		String actionpath = selectNode.attributeValue("path");
		String actiontype = selectNode.attributeValue("type");
		//将path值以及type值初始化到我们的action模型中去
		ActionModel action= new ActionModel();
		action.setPath(actionpath);
		action.setType(actiontype);
		//拿到了actionmodel的时候,我们再去拿action中的forward
		List<Element> selectNodes2 = selectNode.selectNodes("forward");
		//遍历action	
		for (Element selectNode2 : selectNodes2) {
			//拿到了forward中的属性值
			String forwardname = selectNode2.attributeValue("name");
			String forwardpath = selectNode2.attributeValue("path");
			String forwardredirect = selectNode2.attributeValue("redirect");
			//分别初始化到我们的对象模型中去
			ForwardModel forward= new ForwardModel();
			forward.setName(forwardname);
			forward.setPath(forwardpath);
			forward.setRedirect(!"false".equals(forwardredirect));
			//将初始化好的对象模型放到action模型之中去
			action.push(forward);
			
		}
		
		
		
		//将初始话好的action模型放到config模型中去
		con.push(action);
		
		
		}
		return con; 
	}
	

弹栈,拿到指定值

现在,通过我们弹栈的方法,来拿到指定的值

	public static void main(String[] args) throws Exception {
		//调用方法测试是否拿到所有的值
		ConfigModel config = test_01.build("/com.xml");
		System.out.println(config);//拿到了对应的config对象
		//此时我们要通过这个对象模型取出第二个action中的第二个forward中的path值
		//根据config对象模型中pop方法,根据path拿到对应的action
		ActionModel action = config.pop("/loginAction");

//		String path2 = action.getPath();
//		System.out.println(path2);
//根据初始化好的actopn中的forward的name值,拿到对应的forward对象
		ForwardModel forward = action.pop("success");
		//最后根据对象模型中的get方法。就可以拿到指定的值啦
//最后得到对象,调用get方法,就可以拿到值啦
		String path = forward.getPath();
		System.out.println(path);
		
		
	}

看结果

 

以上就是今天的XML建模的全过程啦,

总结

使用map集合存储

很多小伙伴们可能会不理解为什么要使用map集合,这是因为在我们的标签中,其中的属性值与标签是一对一的关系,我们可以将其保存在map集合中,到时候拿到的时候,我们可以通过map集合中的get方法,通过map键,也就是存放的属性值,拿到所对应的标签模型对象,也就是map值

使用list集合存储

但是如果标签中没有对应的属性,我们应该怎么存放呢?

如果XML语言中的标签没有属性,通常建议使用List集合来表示这些标签。因为List是一个有序的集合,可以按顺序添加标签,并且不需要使用一个key来表示标签的名称。另一方面,使用Map集合来表示没有属性的标签并不具备一些优势,因为Map集合通常用于存储具有键值对关系的数据

为什么使用list会更好一些

  1. 有序:List是一个有序的集合,可以按顺序添加标签,这与XML中标签出现的顺序相匹配。并且我们可以轻松地插入、添加和删除标签,而这对于Map集合可能会比较麻烦。

  2. 易于遍历:List集合可以通过for循环进行遍历,方便我们从XML中提取数据。如果我们使用Map集合,则需要通过迭代Map的键值对来遍历XML中的标记,这可能会让代码更加繁琐。

  3. 简洁:在没有属性的标签中使用List集合可以让我们的建模更加整洁、直观。

总之,使用List集合来建模XML标签是一种简洁而且易于维护的方式,它提供了一种有序的数据结构来表示XML文档中的标签序列,而且易于遍历,提取数据和操作。

这就关系到了我们的集合框架啦,如果想了解的小伙伴们可以看看小编的集合框架文章,今天就到这里啦,古德拜~

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值