可能是因为以前都已经具备了的一些面象对象的基础------总体感觉这课不难!
虽然现在学的东西都是以前经常接触的东西,仍旧感觉学到很多不错的东西,特别是一在强调的查阅文档的能力很重要,我也意识到了!因为JAVA是开源软件的原因吧,所有有很多的开源工具,而仅仅解析xml常用的就有:DOM,SAX,JDOM,DOM4J..更不说其它的JAVA开源工具了,也有成百上千吧!所以如果凭一个人的记忆是不可能做到的,因此学习能力就显得格外的重要了,所以老师这样强调对于学生来讲很必要,让我欣慰的是,他们没有要求我们记忆,而是带着我们一步一步的学习查阅文档,怎么去查阅可以快速的得到想要的东西!这是经验吧!以前看到英文文档就不知道所措的我,也许是因为在这个行业不得不要做的选择时,现在看英文文档的能力在不自觉中已经提升了一大截。
总结
XML 的用途
1.存取数据 2.配置属性 从以往在项目的经历(在重庆X软件公司时,从一个数据中将数据读出,然后生成的是XML文档,另一台服务器根据读取该XML的值,填充到数据表中) xml主要用于配置 用xml传递数据也比较常用.
DOM,SAX,JDOM,DOM4J 解析xml的公优缺点:
DOM 基于树型 将所有的内容读入内存,所以当xml文件很大时,很消耗内存 数据量小
SAX 基于事件型 需要自自己实现 数据量大时
JDOM 是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快
DOM4J 具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM(Java API for XML Messaging )也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件. 综合性勇优越
我们主要学习的是DOM4J解析XML的技术,其它的了解
读取 xml 数据的几个步骤:
找到文件-------new File(filepath);
打开文件------- new FileInputStream(file);
通过一台机器把 InputStream变成树状的东西-----Document new XMLReader().read(in).
找树根---users document.getRootElement();
找树枝---user
找树叶----id,username 对应的值(标签体)
关闭流 close();
这儿学习,不是背住这个步骤,而是一种思想。
如果要我自己写一个解析xml文件的工具,肯定要对文件进行操作,一定会用到流,所以会用流去定位文件。然后在去读取文件中的字符进行判断。而在这里,DOM4J已经提供了操作XML文件的类,我们只要去调用现成的方法既可。
描述一个用户实体的属性:
Id,username,password,gender,birth,address
<?xml version="1.0" encoding="utf-8j" ?>
<users count="2">----------------->相当于表名
<user>--------------->表中的一条记录
<id></id>-------->记录中的值
<username></username>
<passowrd></passwordl>
</user>
<user>
<id></id>
<username></username>
<passowrd></passwordl>
</user>
</users>
从上图可知,如果用xml文件存储数据也可以取得和数据储存的效果。
几种存储方式:
1. 普通 txt 文件------------存取不便
2. 数据库 ------------没必要
3. xml 技术 -------------结构清晰,层次明了
问题:
1. 查询所有的用户
2. 查询是否存在指定名称用户?如果存在返回该用户完整信息,否则提示没有。
3. 对用户名进行模糊查询
4. 对任意字段进行模糊查询
分析:
返回值:
User--------null 表示不存在。
Int,boolean----不能表示一个完整对象。
IUserDAO:
User getUserByUsername(String username)
List<User> getAllUser();
List<User> getUserListByKeyword(String keyword);
UserDAO
写 xml 数据
1. 得到一棵树:从内存中创建(空树)
2. 往树上挂树根 users 3. 往树根挂树枝 user
4. 往树枝上挂子树枝 id,username,birth,gender等
5. 往子树枝设值
6. 保存树在硬盘上。
Flush:强制刷新缓冲的内容到硬盘中。
问题:
如何读取属性?
element.attribute(属性名).getValue()
如何格式化输出 xml 文件?
设置输出的标准
输出格式:
XMLWriter 以 FileWriter
OutputFormat.createPrettyPrint
setIndent
如何输出中文?
解决中文问题:用 OutputStream 替换 Writer
准备:引入 java 类,用来封装 user数据,或者与 xml 的 user标签建立映射关系。
DocumentManager:
统一管理 Document 对象
转化为日期格式:
Date.valueOf(String)
问题:把 xml 当作一个单表来使用?
1. 读取所有的 user 信息
2. 读取指定 id号的用户的信息。
3. 读取 count 属性,用于获取到用户数量。 Attribute
4. 对读取元素加以排序
Comparator对对象集合排序
接口:Comparator-----制定排序标准,compare
第一:转成实际上进行比较对象的类型
第二:取出真正排序属性值。
-1----升序,+1----降序
被排序的对象可以是一个 List,直接从查询结果得到。
Collections.sort();把排序标准与被排序的对象关联起来。
优化:随意控制升降序
优化:对任意字段进行排序
5. 判断指定 id值是否存在。
6. 插入一个用户到 xml 中去。
分析:
找到树根
根据 id 判断用户是否存在
如果存在,抛出异常,退出程序。
构建树枝(根据用户属性值)
挂树枝到树根
修改树根属性 count
回写树到硬盘
引入 UserExistsException
7. 主键采用自增方式。(得到最大值加 1)
得到树根
得到 user树枝
得到所有 id,找到最大值
Id 加 1
8. 增加一个用户,主键是自增长。
得到树根,产生主键,设置用户 id值
得到树根,
构建树枝
挂树枝到树根
得到 count 属性,并且加一
回写树倒硬盘。
9. 修改 count 属性
得到根元素中 count 属性值
根据外部调用者的需求,确定是增大还是减小
重新设置 count 属性
10. 根据 id 删除一个用户(查找+删除)
借助根元素,找到该 id所在 user元素
从根元素中删除 user元素
得到 count 属性,并且减一 回写到硬盘
只有从根上删除掉并且存盘成功,才可认为整个删除操作成功。
11. 根据 id 修改除 id 之外所有属性。(查找+修改)
分析:
得到根元素根据 id 找到对应 user元素
替换除 id 之外的所有值。
回写到硬盘。
总结:
从上面的总结中可以看出。其实要实现上面的功能并不是很难!我感觉收藏最大的是对代码的忧化。这也是我在以前做项目时没有体会到的,当时只是学了基础就上了阵,做了项目都没有真正的去想让代码重用。今天从赖老师的写的代码上看到,如果将代码重用得当,可以让类的结构变得层次分明,一是起到了复用的作用,更是让代码的可读性大大增加!