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


所有评论(0)