前言
XML建模是指使用标记语言XML来描述数据模型的过程。XML使用标记、元素和属性来描述数据模型,可以把一个复杂的数据模型表示成更加容易理解和可读的形式,便于人们进行交流和数据处理。
在XML建模中,通过定义XML元素和属性的组合,可以描述数据实体的属性和关系。XML建模通常使用文本编辑器或者XML编辑器来完成,通过定义DTD(文档类型定义)或XML Schema来规定XML文档的结构和内容,使得不同的系统或应用之间能够相互交流和共享数据。
XML建模通常应用于数据交换、服务描述、文档生成等领域,可以方便地进行数据转换和数据集成。同时,XML建模也是许多Web服务和服务导向架构(SOA)的基础技术之一。
目录
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会更好一些
-
有序:List是一个有序的集合,可以按顺序添加标签,这与XML中标签出现的顺序相匹配。并且我们可以轻松地插入、添加和删除标签,而这对于Map集合可能会比较麻烦。
-
易于遍历:List集合可以通过for循环进行遍历,方便我们从XML中提取数据。如果我们使用Map集合,则需要通过迭代Map的键值对来遍历XML中的标记,这可能会让代码更加繁琐。
-
简洁:在没有属性的标签中使用List集合可以让我们的建模更加整洁、直观。
总之,使用List集合来建模XML标签是一种简洁而且易于维护的方式,它提供了一种有序的数据结构来表示XML文档中的标签序列,而且易于遍历,提取数据和操作。
这就关系到了我们的集合框架啦,如果想了解的小伙伴们可以看看小编的集合框架文章,今天就到这里啦,古德拜~