为什么使用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>