一、XML的概述(了解)
* eXtensible Markup Language 可扩展标记语言
* 宗旨是传输数据,而非显示数据。
* XML标签没有被预定义,需要用户自行定义标签。
* XML技术是W3C组织(WorldWideWeConsortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。
* 作用: a. 传输数据
b. 配置文件(主要用途)
二、XML的语法(掌握)
* <?xml version=“1.0”?> 文档声明必须出现在第一句
* 一个标签有如下两种书写形式:
包含标签主体:<mytag>some content</mytag>
不含标签主体:<mytag/>
* 一个XML文档必须有且仅有一个根标签
* XML中不会忽略主体内容中出现的空格和换行。
* 严格区分大小写
* <!--这是注释-->
* CDATA : 把标签当做普通文本内容;
<![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 元素名
属性名1 属性值类型 设置说明
属性名2 属性值类型 设置说明>
* Schema(难)
四、XML的解析(掌握)
* 解析的方式
* DOM 解析(Java解析) : 利用DOM树来解析
* SAX 解析 : 边加载边解析.
* 解析包
* JAXP (sun 公司提供)
* DOM4j (第三方)
* 单元测试
* 搭建环境: 在工程中引入junit包
* 测试方法:
1. 测试方法必须是公有的
2. 测试方法必须返回值是void
3. 测试方法必须加@Test
4. 测试方法没有形参
@Test : 代表测试方法
参数timeout: 指定执行方法所需最多时间(毫秒)
expected: 指定方法会出现的异常类型(用元类表示)
@Before : 执行每个测试方法之前都要执行的方法
@After : 执行每个测试方法之后都要执行的方法
* Dom4j解析(掌握)
* document的方法:
elements() : 拿到节点的所有子节点
elements(String) : 拿到指定名字的所有的子节点
element(String) : 拿到指定名字的子节点
* Element节点的方法:
setText() : 设置标签节点的内容
getTest() : 获得标签节点的内容
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:书架>
3、引入的名称空间根哪个xsd文件对应?
使用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.实现的功能:
输入字母a添加用户;输入b按照身份证查找用户;输入c按照身份证删除用户。
该功能主要分为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: @Override
41: 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。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|