创建一个xml解析工具类,了解其解析原理。

全程使用封装思想。

需求:创建一个xml解析工具类,通过用户指定的id值或者class文件路径判断其是否存在,如果存在就返回相对应的对象,如果不存在就返回null;

需要用到的知识:

【变量定义,数据类型转换,控制语句,循环,自定义方法,类的定义,多态,集合框架,IO流,异常体系,反射,xml解析等知识】

工具类封装代码:

package cn.yun.xmldom;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.Set;

import org.dom4j.Attribute;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

/**

*xml解析工具类 使用DOM4j进行解析

*需求:解析xml文件,数据通过map集合进行存储,通过传入指定的ID值或者class值返回给一个对应的实体类对象

*封装思路:解析需要的xml文件,将解析后的id值和class值存储到map集合中,根据用户给定的id或class路径判断map集合中

*是否存在,如果存在就通过获取的路径进行反射,返回一个对应的实体类对象

*步骤:

*1,创建一个解析器,通过解析器解析xml文件(以流的形式解析) 解析后返回的是Document对象

*2,使用解析器解析xml文件,将得到的id值或class值存入map集合中

*2.1:先创建一个map集合,用来存储id值或者class值

*2.2:进行解析,获取对应的值,将对应的值存放在map集合中

*3,定义一个功能,根据用户指定的id值返回相应的对象

*4,定义一个功能,根据用户指定的class值返回相应的对象

*/

public class XmlDemo {

public static void main(String[] args) throws FileNotFoundException, DocumentException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

inMap("src/UserDom.xml");//调用解析器 传入要解析的xml文件路径

//Object obj=getnewID("user"); //通过指定id来返回对象

Object obj=getnewClass("cn.yun.xmldom.user.User");//通过指定的class文件路径来返回对象

System.out.println(obj);

}

//创建一个map集合 用来存放id和class的值

//key存放的id对应的值(String类型) value存放的是class对应的值(Object类型)

private static Map map=new HashMap<>();

/**

* 根据指定的xml文件路径进行进行,解析后返回的是Document对象

* @param xmlPath 指定的xml文件路径

* @return 返回Document对象

* @throws FileNotFoundException 路径找不到异常

* @throws DocumentException 文件解析失败异常

*/

public static Document xmlDt(String xmlPath) throws FileNotFoundException, DocumentException {

//创建DOM4j解析器

SAXReader reader=new SAXReader();

//通过解析器,获取Document对象 reader.read()解析-----

//new FileInputStream(xmlPath)通过流的形式进行进行 xmlPath是要解析的xml文件路径

Document document=reader.read(new FileInputStream(xmlPath));

//返回Document对象给该方法

return document;

}

/**

* 通过解析,将解析到的属性对应的值存放在map集合对应的key和value中

* @param xmlPath 指定的xml文件路径(需要解析的xml文件路径)

* @throws FileNotFoundException 路径找不到异常

* @throws DocumentException 文件解析失败异常

*/

public static void inMap(String xmlPath) throws FileNotFoundException, DocumentException {

//调用xmlDT方法,返回的是document对象

Document document=xmlDt(xmlPath);

//通过document对象调用getRootElement()方法获取根节点,返回的是Element类型的根节点对象

Element root=document.getRootElement();

//通过根节点获取子节点 根节点对象调用elements()方法获取所有的子节点,

//返回的是List集合(子节点集合) 集合中元素的类型是类型

List list=root.elements();

String key=null;//存放map集合的key值

String value=null;//存放map集合value值

//遍历子节点集合

for(Element el:list) {

//通过子节点获取子节点上的所有属性节点,字节点对象调用attributes()方法获取子节点的所有属性

//返回的List集合(子节点属性集合) 集合中元素的类型是类型

List attrlist=el.attributes();

//遍历子节点属性集合

for(Attribute attr:attrlist ) {

//通过子节点属性获取子节点属性的名字,子节点属性调用getName()方法获取所有子节点的属性名字 返回的是字符串

String keyName=attr.getName();

//通过子节点属性获取子节点属性的值,子节点属性调用getValue()方法获取所有子节点的属性值 返回的是字符串

String keyValue=attr.getValue();

//如果属性的名字是id就将属性id对应的值存放在map集合的key值中

if("id".equals(keyName)) {//判断属性名字是否是id

key=keyValue;//将属性id对应的值赋给map集合的key

}

//如果属性的名字是class就将属性class对应的值存放在map集合的value值中

if("class".equals(keyName)) {//判断属性名字是否是class

value=keyValue;//将属性class对应的值赋给map集合的value

}

}

map.put(key, value);

}

//System.out.println(map);

}

/**

* 遍历Map集合 通过用户指定的ID值判断是否存在,如果存在就返回相对应的对象,不存在就返回null

* @param id 用户指定的id值

* @return 如果id值存在就返回相对应的对象,不存在就返回null

* @throws ClassNotFoundException

* @throws NoSuchMethodException

* @throws SecurityException

* @throws InstantiationException

* @throws IllegalAccessException

* @throws IllegalArgumentException

* @throws InvocationTargetException

*/

public static Object getnewID(String id) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

//将Map集合转换成set集合 调用entrySet()方法将key和value的值打包成一个

Set> set=map.entrySet();

//获取迭代器

Iterator> it=set.iterator();

//遍历集合,获取到迭代器以后通过while循环遍历集合

while(it.hasNext()) {

//获取key和value打包在一起的对象, 使用next()方法获取,返回的是Map.Entry类型

Map.Entry et=it.next();

//获取map集合中key的值 通过key和value打包在一起的对象调用getKey()方法,单独获取key的值

String mapKey=et.getKey();

//判断用户指定的id值是否和获取到map集合中key的id值一致

if(id.equals(mapKey)) {//判断指定的id是否和map集合key中存储的id值一致

//当id值一致了,就获取map集合中的value值

//获取map集合中的value值,通过key和value打包在一起的对象调用getValue()方法 单独获取value的值

String mapvalue=(String) et.getValue();

//开始反射,此时获取到的value值就是class的值(class文件的路径)

Class cls=Class.forName(mapvalue);

//获取无参构造器,通过反射得到的class对象调用getConstructor()方法来获取指定参数的构造器

Constructor cons=cls.getConstructor();

//返回无参构造器对应的对象 通过无参构造器调用newInstance()方法来获取对象

return cons.newInstance();

}

}

//如果用户指定的id不存在就返回null

return null;

}

/**

* 遍历Map集合 通过用户指定的class的值(文件路径)判断是否存在 如果存在就返回class文件路径相对应的对象,不存在返回null

* @param cls 用户指定class文件路径

* @return 如果用户指定的路径存在,就返回相对应的对象,如果不存在就返回null

* @throws ClassNotFoundException

* @throws NoSuchMethodException

* @throws SecurityException

* @throws InstantiationException

* @throws IllegalAccessException

* @throws IllegalArgumentException

* @throws InvocationTargetException

*/

public static Object getnewClass(String cls) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

//将map集合转换成set集合,将key和value的值打包成一个对象

Set> set=map.entrySet();

//获取迭代器

Iterator> it=set.iterator();

//遍历集合,获取完迭代器以后通过whlie循环遍历集合

while(it.hasNext()) {

//获取key和value打包在一起的对象

Map.Entry et=it.next();

//获取value的值

String mapValue=(String) et.getValue();

//判断用户指定的class的值是否和map集合value值中存储的class值一致

if(cls.equals(mapValue)) {

//开始反射

Class clas=Class.forName(mapValue);

//获取无参构造器

Constructor cons=clas.getConstructor();

//返回无参构造器对应的对象

return cons.newInstance();

}

}

//如果用户指定的class值不存在,就返回null

return null;

}

}

XML文件:

定义一个用户实体类User:

package cn.yun.xmldom.user;

public class User {

private String name;

private int age;

private String sex;

public User() {}

private User(String name) {

this.name=name;

}

public User(String name, int age, String sex) {

super();

this.name = name;

this.age = age;

this.sex = sex;

}

private void show() {}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

@Override

public String toString() {

return "UserDemo [name=" + name + ", age=" + age + ", sex=" + sex + "]";

}

}

标签:xml,map,throws,String,id,集合,工具,解析,class

来源: https://blog.csdn.net/qq_43383753/article/details/110144026

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐