[基于达内教育的学习,总结提炼]
一.概述:
1.XML 指可扩展标记语言 (Extensible Markup Language)
2.XML 的设计宗旨是传输数据,而非显示数据
3.XML 利用标签来保存数据
4.标签之间通过嵌套关系来表示数据之间的层级关系
二.XML的用途:
1.用来传输数据 (具有跨平台的特性,因此可以在不同的操作系统上交互)
2.因为XML能保存具有结构化的数据, 所有也常用作程序的配置文件
三.语法:
1. 文档声明: <?xml version=”1.0” encoding=”utf-8”?>
version指XML文档所遵循的版本号, encoding指用来通知解析器使用什么编码来解析当前XML文档. 但encoding指定的编码和XML文档保存时的编码必须一致.
2. 标签 ( 元素 )
标签体: 开始标签和结束标签之间的文本. 如<大学>xxxxx</大学>中的xxxxx就是标签体
自闭标签: 如果元素中不包含任何内容,则可以合并为自闭标签. 如<大学/>, 这就是一个自闭标签
根标签: 一个XML文档中有且只有一个根标签
命名规范: 1) 区分大小写, 如 <a>和<A>是两个不同的标签
2) 不能以数字和标点符号开头, 如 不能<1a>
3) 不能以XML,xml开头
4) 不能包含空格和冒号
3. 属性
一个标签中可以有多个属性,每个属性之间用空格隔开,属性必须用 ( ' ) 或 ( " ) 引起来
4. 注释
<!-- 注释内容 -->
5. 转义字符
< <
> >
“ "
‘ '
& &
四.解析:
1. DOM解析:解析器把整个XML文档加载进内存,保存为一颗Document的对象树,通过Document对象,找到树上的节点对象, 每个对象都提供增删改查操作对应的方法.
优点: 1) 可以十分方便对节点进行增删改查操作
2) 由于在内存中保存了文档结构树,解析一次即可重复使用数据
缺点: 1) 如果文档较大,会占用内存空间,甚至内存溢出
2) 将整个文档解析完才能操作,相对消耗时间,效率较低
2.SAX解析:解析器逐行扫描XML文档, 利用处理器接口中的方法进行解析
优点: 1) 无需将整个XML文档加载到内存中,占用内存小
2) 由于逐行解析, 遇到需要内容停下来处理, 效率高
缺点: 1) 每次需要数据,都需要重新解析
2) 只能读取数据,不能做增删改操作
五.示例:
<?xml version="1.0" encoding="UTF-8"?>
<学校>
<学院>
<课程>离散数学</课程>
<课程>数据分析与应用</课程>
</学院>
<学院 名称="药学院"> <教师>张三</教师>
</学院>
</学校>
1. 查询第一个学院的第一门课程
// 1.创建解析器
// DOM解析为什么用SAX解析,应该是DOM解析实质上通过SAX解析读取的
SAXReader reader = new SAXReader();
// 2.利用解析器读取xml文档
Document dom = reader.read("school.xml");
// 3.获取根节点
Element root = dom.getRootElement();
// 4.获取第一个学院
Element college = root.element("学院");
// 5.获取学院节点
Element course = college.element("课程");
// 6.获取课程内容
String text = course.getText();
2.查询第二个学院的教师
// 1.创建解析器
SAXReader reader = new SAXReader();
// 2.利用解析器读取xml文档
Document dom = reader.read("school.xml");
// 3.获取根元素
Element root = dom.getRootElement();
// 4.获取第二个学院元素
List<Element> list = root.elements();
Element college = list.get(1);
// 5.获取第二个学院的教师名字
Element tech = college.element("教师");
// 6.获取教师名字
String text = tech.getText();
3. 向第一个学院添加一个教师节点(两种方式)
// 1.创建解析器
SAXReader reader = new SAXReader();
// 2.利用解析器读取xml文档
Document dom = reader.read("school.xml");
// 3.获取根元素
Element root = dom.getRootElement();
// 4.获取第一个学院元素
Element college = root.element("学院"); // 5.添加教师节点 // 方式一,创建一个游离的教师节点,挂载到父节点上
Element tech = DocumentHelper.createElement("教师");
techName.setText("李四");
college.add(tech); // 方式二,直接在父节点上添加教师节点
Element tech = college.addElement("教师");
tech .setText("王五"); // 6.将内存中的document对象写到xml文档中
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("school.xml")), OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
4. 向第二个学院在教师节点前插入一个学生节点
// 利用工具类获取document对象
Document dom = XMLUtils.getDom("school.xml");
// 获取根元素
Element root = dom.getRootElement();
// 获取第二个学院
List<Element> list = root.elements();
Element college = list.get(1);
// 创建一个游离的学生节点
Element stu = DocumentHelper.createElement("学生");
sty.setText("A学生");
// 获取第二个学院下的元素
List list2 = college.elements();
list2.add(1, stu);
// 将document文档更新到xml中
XMLUtils.write2Xml(dom, "school.xml");
5. 删除第二个学院的教师节点 (两种方式)
// 1.利用工具类获取Document对象
Document dom = XMLUtils.getDom("book.xml");
// 获取根元素
Element root = dom.getRootElement();
// 获取第二个学院
List<Element> list = root.elements();
Element college = list.get(1);
// 方式一:获取教师节点,从父元素中删除 Element tech= college.addElement("教师");
college.remove(tech);
// 方式二:从list中删除
List<Element> list2 = college.elements();
list2.remove(1);// 将更新的document写到xml中
XMLUtils.write2Xml(dom, "school.xml");
6. 更新第一个学院的第一个课程节点的内容为统计学
// 1.利用工具类获取Document对象
Document dom = XMLUtils.getDom("school.xml");
// 2.获取根元素
Element root = dom.getRootElement();
// 3.获取第一个学院
Element college = root.element("学院");
// 4.获取课程节点
Element course= bookEle.element("课程");
// 5.更新内容
course.setText("统计学");// 将更新的document写到xml中
XMLUtils.write2Xml(dom, "school.xml");
7. 给第一个学院添加一个属性, 名称="计算机与信息工程学院"
// 读取xml文档
Document dom = XMLUtils.getDom("school.xml");
// 获取第一个学院
Element college= dom.getRootElement().element("学院");
// 方式一:
Attribute attr = college.attribute("名称");
attr.setValue("计算机与信息工程学院");
// 方式二:
Attribute attr2 = college.attribute(0);
attr2.setValue("计算机与信息工程学院");
// 方式三:
String value = college.attributeValue("计算机与信息工程学院"); // 只能获取,不能增删改// 将更新的document写到xml中
XMLUtils.write2Xml(dom, "school.xml");
8. 更新第二个学院的属性为"物理与电子学院"(3种方式)
// 读取xml文档
Document dom = XMLUtils.getDom("school.xml");
// 获取第二个学院
Element college = dom.getRootElement().element("学院");
// 方式一:
Attribute attr = college.attribute("学院");
attr.setValue("物理与电子学院");
// 方式二:
Attribute attr2 = college.attribute(0);
attr2.setValue("物理与电子学院");
// 方式三:
String value = college.attributeValue("学院"); // 只能获取,不能增删改// 将更新的document写到xml中
XMLUtils.write2Xml(dom, "school.xml");
9. 删除第一个学院的属性(2种方式)// 读取xml文档
Document dom = XMLUtils.getDom("school.xml");
// 获取第一个学院
Element college = dom.getRootElement().element("学院");
//方式一:获取第一个学院的属性,从父元素中删除
Attribute attr = college.attribute("计算机与信息工程学院");
college.remove(attr);
//方式二:
college.addAttribute("计算机与信息工程学院", null);
// 将更新的document写到xml中
XMLUtils.write2Xml(dom, "school.xml");