一、XML的概述(了解)
* eXtensible MarkuP Language 可扩展标记语言
* 宗旨是传输数据,而非显示数据。
* XML技术是W3C组织(WorldWideWeConsortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。
* 作用: a. 传输数据
b. 配置文件(主要用途)
二、XML的语法(掌握)
* <?xml version=“1.0”?> 文档声明必须出现在第一句
包含标签主体:<mytag>some content</mytag>
* XML中不会忽略主体内容中出现的空格和换行。
* 严格区分大小写
* <!--这是注释-->
<![CDATA[
<itcast>www.itcast.cn</itcast>
]]>
三、XML的约束(看懂即可,掌握引入外部约束文件的语句)
* DTD
*分类:
格式良好的XML:遵循XML语法的XML
有效的XML:遵循约束文档的XML
约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等。
注意:dtd文档必须用utf-8编码格式保存
* 校验XML的有效性
* 非校验解析器
* 校验解析器
* DTD 文件的引入:
当引用的DTD文档在本地时,采用如下方式:<!DOCTYPE 根元素 SYstem “DTD文档路径”>
当引用的DTD文档在公共网络上时,采用如下方式:
<!DOCTYPE 根元素 PUBLIC “DTD名称” “DTD文档的URL”>
eg : <!DOCTYPE web-app PUBLIC
"-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
* DTD文件的语法
在DTD文档中使用ELEMENT关键字来声明一个XML元素。
如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。
如果子元素用“|”分开,说明任选其一
用+、*、?来表示元素出现的次数
定义属性:
<!ATTLIST 元素名
* Schema(难)
四、XML的解析(掌握)
* 解析的方式
* DOM 解析(Java解析) : 利用DOM树来解析
* SAX 解析 : 边加载边解析.
* 解析包
* JAXP (sun 公司提供)
* DOM4j (第三方)
* 单元测试
* 搭建环境: 在工程中引入junit包
* 测试方法:
1. 测试方法必须是公有的
2. 测试方法必须返回值是void
3. 测试方法必须加@Test
4. 测试方法没有形参
@Test : 代表测试方法
参数timeout: 指定执行方法所需最多时间(毫秒)
* Dom4j解析(掌握)
* document的方法:
elements() : 拿到节点的所有子节点
elements(String) : 拿到指定名字的所有的子节点
element(String) : 拿到指定名字的子节点
* Element节点的方法:
addAttibute(String name,String value ) : 添加标签的属性
removeAttribute(String name) : 删除某个属性
* XPath: 主要作用是获取某个节点的路径 。
五、Schema(掌握如何引入一个schema文件)
* 名称空间 : 指的是一个环境,所用的标签来自于哪个环境定义的。
* 掌握引用schema文件:
xml中引入schema约束的步骤:
1、查看schema文档,找到根元素,在xml中写出来
<?xml version="1.0" encoding="UTF-8"?>
<书架>
</书架>
2、根元素来自哪个名称空间。使用xmlns指令来声明
名称空间是在schema中定义的,就是targetNamespace的值
<?xml version="1.0" encoding="UTF-8"?>
<itcast:书架 xmlns:itcast="http://www.itcast.com/book">
</itcast:书架>
使用schemaLocation来指定:两个取值:第一个为名称空间 第二个为xsd文件的路径
<?xml version="1.0" encoding="UTF-8"?>
<itcast:书架 xmlns:itcast="http://www.itcast.com/book"
schemaLocation="http://www.itcast.com/book book.xsd">
</itcast:书架>
4、schemaLocation哪里来的?它来自一个标准的名称空间,直接复制黏贴即可.
<?xml version="1.0" encoding="UTF-8"?>
<itcast:书架 xmlns:itcast="http://www.itcast.com/book"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.com/book book.xsd">
</itcast:书架>
5、只要以上4部搞好了,对于子标签myeclipse就有提示了
使用dom4j解析xml(xml的增删改查)
1.解析的xml文件
1: <?xml version="1.0" encoding="UTF-8"?>2:3: <exam>4: <student examid="222" idcard="2222">5: <name>cs002</name>6: <location>hn</location>7: <grade>98.0</grade>8: </student>9: <student examid="111" idcard="1111">10: <name>cs001</name>11: <location>bj</location>12: <grade>90.0</grade>13: </student>14: </exam>15:
2.实现的功能:
该功能主要分为4层,分别为bean,util,dao,view。
bean部分:
该部分实现对数据的基本访问和操作。
1: package net.csing;
3: public class Student {4: private String name;
5: private String idcard;
6: private String examid;
7: private String location;
8: private float grade;9:10: public String getName() {
11: return name;
12: }13: public void setName(String name) {14: this.name = name;
15: }16: public String getIdcard() {
17: return idcard;
18: }19: public void setIdcard(String idcard) {20: this.idcard = idcard;
21: }22: public String getExamid() {
23: return examid;
24: }25: public void setExamid(String examid) {26: this.examid = examid;
27: }28: public String getLocation() {
29: return location;
30: }31: public void setLocation(String location) {32: this.location = location;
33: }34: public float getGrade() {35: return grade;
36: }37: public void setGrade(float grade) {38: this.grade = grade;
39: }40: @Override41: public String toString() {
42: return "Student [name=" + name + ",idcard=" + idcard + ",examid="43: + examid + ",location=" + location + ",grade=" + grade + "]";44: }45:46: }47:
util部分:
该部分实现对xml文档的获取和反写;
3: import java.io.FileOutputStream;
4:5: import org.dom4j.Document;
6: import org.dom4j.DocumentException;
7: import org.dom4j.io.OutputFormat;
8: import org.dom4j.io.SAXReader;
9: import org.dom4j.io.XMLWriter;
10:11: public class StudentUtil {12: public Document getDocument(){
13: SAXReader reader=new SAXReader();
14: try {
15: Document document=reader.read("src/exam.xml");
16: return document;
17: } catch (DocumentException e) {
18: e.printstacktrace();19: }20: return null;22: public void write2XML(Document document){23: try{
24: XMLWriter writer=new XMLWriter(new FileOutputStream("src/exam.xml"),OutputFormat.createPrettyPrint());25: writer.write(document);26: writer.close();27: }28: catch(Exception e){
29: e.printstacktrace();30: }31: }32: }33:
dao部分:
3: import org.dom4j.Document;
4: import org.dom4j.Element;
5: import org.dom4j.Node;
6:7: public class StudentDao {8: StudentUtil sd=new StudentUtil();
9: public Document document=sd.getDocument();
10:11: public void addStudent(Student student){12: Element root=document.getRootElement();13: Element newStudent=root.addElement("student");
14: newStudent.addAttribute("examid",student.getExamid())
15: .addAttribute("idcard",student.getIdcard());
16: newStudent.addElement("name").setText(student.getName());
17: newStudent.addElement("location").setText(student.getLocation());
18: newStudent.addElement("grade").setText(student.getGrade()+"");
19: StudentUtil su=new StudentUtil();
20: su.write2XML(document);22: public Student findStudent(String id){
23: Node node=document.selectSingleNode("/exam/student[@idcard="+id+"]");24: Student student;25: if(node!=null){26: student=new Student();
27: student.setExamid(node.valueOf("@examid"));
28: student.setIdcard(node.valueOf("@idcard"));
29: student.setName(((Element)node).element("name").getText());
30: student.setLocation(((Element)node).element("location").getText());
31: student.setGrade(Float.parseFloat(((Element)node).element("grade").getText()));
32: return student;
33: }34:35: return null;37: public void deleteStudent(String id){38: Node node=document.selectSingleNode("/exam/student[@idcard="+id+"]");39: Element element=(Element)node;40: Element root = document.getRootElement();41: root.remove(element);42: StudentUtil su=new StudentUtil();
43: su.write2XML(document);44:45: }47:
view部分:
展现给用户操作的选项。
3: import java.util.Scanner;
5: public class StudentView {6: public static void main(String[] args){7: Scanner scan=new Scanner(system.in);8: System.out.println("添加用户请输入a;");9: System.out.println("查找用户请输入b;");10: System.out.println("删除用户请输入c;");11: String ch=scan.next();12: if(ch.equals("a")){13: addUser();14: }else if(ch.equals("b")){15: findUser();16: }else if(ch.equals("c")){17: deleteUser();18: }19: }20: private static void deleteUser() {21: System.out.println("请输入要删除的用户的身份证号:");22: Scanner scan=new Scanner(system.in);23: String id=scan.next();24: StudentDao sd=new StudentDao();
25: sd.deleteStudent(id);26: }27: private static void findUser() {28: System.out.println("请输入要查找的用户的身份证号:");29: Scanner scan=new Scanner(system.in);30: String id=scan.next();31: StudentDao sd=new StudentDao();
32: Student stu=sd.findStudent(id);33: System.out.println(stu);34: }35: public static void addUser(){36: Scanner scan=new Scanner(system.in);37: System.out.println("请输入学生姓名:");38: String name=scan.next();39:40: System.out.println("请输入学生准考证号:");41: String examid=scan.next();42:43: System.out.println("请输入学生身份证号:");44: String idcard=scan.next();45:46: System.out.println("请输入学生地址:");47: String location=scan.next();48:49: System.out.println("请输入学生得分:");50: String grade=scan.next();51:52: Student stu=new Student();
53: stu.setName(name);54: stu.setExamid(examid);55: stu.setIdcard(idcard);56: stu.setLocation(location);57: stu.setGrade(Float.parseFloat(grade));58: StudentDao sd=new StudentDao();
59: sd.addStudent(stu);60: }62: }63:
代码写的有点臃肿,仍有改善的地方。
以上操作用到了两个jar包。
dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar。