Java序谈之dom4j解析xml文件

为什么使用xml文件?

由于不同的语言之间要进行交互,也就是数据的传输,需要使用中间件,因而使用xml来存储、传输数据。由于xml文档的语法不同于Java语法,想使用xml文件中的数据需要结合Java语法和xml文档的规则,将xml中文件转换成Java语法能使用的文件,也叫做xml解析

xml文件中有什么要注意的?

1、只有以字母开头,被" < >"包围,被xml文档识别的标签才可以使用

2、< ! [ CDATA[ <王宁> ] ] >:意味着放在CDATA中的不会被解析,只当做纯文本

xml文件有哪些常用的解析方式?

①Dom:面向文档二叉树的对象模型

作用:将文件解析成一个二叉树

好处:能充分显示节点之间层级关系,方便对节点进行操作

坏处:将整个解析的文件加载到内存中,太占用空间

②SAX:面向文档接口的逻辑模型

好处:能够将文件不同部分解析为不同的接口,占用较少的内存

坏处:不方便对节点进行操作

③dom4j

特点:充分结合了Dom和SAX的优点,建立一个二叉树,每个节点存放对应接口。

浅拷贝和深拷贝之间有什么区别?

1、浅拷贝:只拷贝对象的引用

特点:改变一个值,另一个值也改变

2、深拷贝:拷贝对象

特点:改变一个值,另一个不变

代码示例:

		//浅拷贝
		Person p1 = new Person("王宁", 18);
		Person p2 = p1;
		//深拷贝
		Person p3 = new Person(p1.getName(), p1.getAge());

使用dom4j的固定格式代码和其中的一些重用方法?

开始固定格式代码示例:

		String string = "./src/lesson/lesson01/School.xml";
		File file = new File(string);
		//获取操作xml文件的输入流
		SAXReader reader = new SAXReader();
		//跟文件或IO输入流建立联系
		Document dom = reader.read(file);
		//获取根节点
		Element root  = dom.getRootElement();
常用的方法:

1、操作节点自身(七种)

		//获取节点名
		System.out.println(root.getName());
		//获取属性数量
		System.out.println(root.attributeCount());
		//获取第一个属性的名称
		System.out.println(root.attribute(0).getName());
		//获取姓名为"name"的属性的值
		System.out.println(root.attribute("name").getValue());
                //根据属性名获取属性值
                System.out.println(root.attribute("name"));
                //获取文件的字符,保存空格
		System.out.println(root.getText());
		//获取文件的字符,不保存空格
		System.out.println(root.getTextTrim());

2、操作节点与节点之间(三种)

		//获取名称为"Teachers"的子节点
		Element son = root.element("Teachers");
		//获取子节点们
		List list = root.elements();
		//获取父节点
		Element parent = son.getParent();

如何使用数据结构表示出一个xml文件?

思路:使用集合(Collection)和字典(Map)来嵌套表示xml文件

思路图:

Java序谈之dom4j解析xml文件_第1张图片

注意:最后的School不能使用Map字典来表示,因为这里一个School名称会对应Students和Teachers,无论Students和Teachers是Map或者Collection

代码分析:

	public static void main(String[] args) throws Exception{
		String s1 = "./src/lesson/lesson01/School.xml";
		File file = new File(s1);
		SAXReader reader = new SAXReader();
		Document dom = reader.read(file);
		Element school = dom.getRootElement();
		Element teachers = school.element("Teachers");
		//创建数组盛放三个老师
		Collection> threeTeachers = new ArrayList<>();
		List listTeacher = teachers.elements();
		for (Element teacher : listTeacher) {
			Map oneTeacher = new HashMap<>();
			oneTeacher.put("id", teacher.attribute("id").getValue());
			//注意在这里的for each 循环中,生成的是默认元素类型为Object的集合
			for (Object element : teacher.elements()) {
				Element name = (Element)element;
				oneTeacher.put(name.getName(), name.getText());
			}
			threeTeachers.add(oneTeacher);
		}
		Element students = school.element("Students");
		//创建数组盛放三个学生
		Collection> threeStudents = new ArrayList<>();
		List listStudent = students.elements();
		for (Element student : listStudent) {
			Map oneStudent = new HashMap<>();
			oneStudent.put("num", student.attribute("num").getValue());
			for (Object element : student.elements()) {
				Element name = (Element)element;
				oneStudent.put(name.getName(), name.getText());
			}
			threeStudents.add(oneStudent);
		}
		//汇总
		Map>> teachersMap = new HashMap<>();
		Map>> studentsMap = new HashMap<>();
		teachersMap.put("Teacher", threeTeachers);
		studentsMap.put("Student", threeStudents);
		Collection>>> schoolCollection = new ArrayList<>();
		schoolCollection.add(teachersMap);
		schoolCollection.add(studentsMap);
		System.out.println(schoolCollection);
	}

所操作的XML文件代码示例:


	
	民办高级小学生聚集地]]>
	
		
			王宁
			
			计算机
			100
		
		
			李小龙
			
			截拳道
			500
		
		
			吴恩达
			
			机器学习
			100
		
	
	
		
			甄子丹
			
			一班
		
		
			邹兆龙
			
			二班
		
		
			安志杰
			
			三班
		
	














你可能感兴趣的:(Java)