一.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");
- XML的作用:
配置
*.properties
*.xml
*.ini
*.yaml/*.yml
数据交换
xml
webservice
json
- 使用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}}}
没毛病。。。