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<Element> list = root.elements();
		//获取父节点
		Element parent = son.getParent();

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

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

思路图:


注意:最后的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<Map<String, String>> threeTeachers = new ArrayList<>();
		List<Element> listTeacher = teachers.elements();
		for (Element teacher : listTeacher) {
			Map<String, String> 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<Map<String, String>> threeStudents = new ArrayList<>();
		List<Element> listStudent = students.elements();
		for (Element student : listStudent) {
			Map<String, String> 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<String, Collection<Map<String, String>>> teachersMap = new HashMap<>();
		Map<String, Collection<Map<String, String>>> studentsMap = new HashMap<>();
		teachersMap.put("Teacher", threeTeachers);
		studentsMap.put("Student", threeStudents);
		Collection<Map<String, Collection<Map<String, String>>>> schoolCollection = new ArrayList<>();
		schoolCollection.add(teachersMap);
		schoolCollection.add(studentsMap);
		System.out.println(schoolCollection);
	}

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

<School value = "学校老师" name = "王宁">
	<!-- CDATA规定其中内容,XML不再解析,CDATA中文字为纯文本 -->
	<![CDATA[<省重点>民办高级小学生聚集地]]>
	<Teachers name="老师" age = "26">
		<Teacher id="10000">
			<name>王宁</name>
			<gender>男</gender>
			<subject>计算机</subject>
			<salary>100</salary>
		</Teacher>
		<Teacher id="10086">
			<name>李小龙</name>
			<gender>男</gender>
			<subject>截拳道</subject>
			<salary>500</salary>
		</Teacher>
		<Teacher id="10010">
			<name>吴恩达</name>
			<gender>男</gender>
			<subject>机器学习</subject>
			<salary>100</salary>
		</Teacher>
	</Teachers>
	<Students name="学生">
		<Student num="001">
			<name>甄子丹</name>
			<gender>男</gender>
			<class>一班</class>
		</Student>
		<Student num="002">
			<name>邹兆龙</name>
			<gender>男</gender>
			<class>二班</class>
		</Student>
		<Student num="003">
			<name>安志杰</name>
			<gender>男</gender>
			<class>三班</class>
		</Student>
	</Students>
</School>














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值