6、XML(2)
1 总结XML基础
XML基础
1)XML的作用
1.1 作为软件配置文件
1.2 作为小型的“数据库”
2)XML语法(由w3c组织规定的)
标签:
标签名不能以数字开头,中间不能有空格,区分大小写。有且仅有一个根标签。
属性:
可有多个属性,但属性值必须用引号(单引号或双引号)包含,但不能省略,也不能单双混用。
文档声明:
<?xml version="1.0" encoding="utf-8"?>
encoding="utf-8": 打开或解析xml文档时的编码
注意:
保存xml文档时的编码 和 解析xml文档时的编码要保持一致,才能避免中文乱码问题!
3)XML解析
程序读取或操作xml文档
两种解析方式: DOM解析 vs SAX解析
DOM解析原理:一次性把xml文档加载成Document树,通过Document对象得到节点对象,通过节点对象访问xml文档内容(标签,属性,文本,注释)。
Dom4j工具(基于DOM解析原理):
读取xml文档:
Document doc = new SAXReader().read("xml文件");
节点:
nodeIterator(); 所有节点
标签:
element("名称") 指定名称的第一个子标签对象
elementIterator("名称"); 指定名称的所有子标签对象
elements(); 所有子标签对象
属性:
attributeValue(“名称”) 指定名称的属性值
attribute("名称") 指定名称的属性对象
getName() 属性名称
getValue() 属性值
atributeIterator() 所有属性对象(Iterator)
attributes() 所有属性对象(List)
文本:
getText() 得到当前标签的文本
elementText("子标签名称") 得到子标签的文本
今天的目标: Dom4J修改xml + xPath技术 + SAX解析 + XML约束
2 Dom4j修改xml文档
2.1 写出内容到xml文档
XMLWriter writer = new XMLWriter(OutputStream, OutputForamt)
wirter.write(Document);
2.2 修改xml文档的API
增加:
DocumentHelper.createDocument() 增加文档
addElement("名称") 增加标签
addAttribute("名称",“值”) 增加属性
修改:
Attribute.setValue("值") 修改属性值
Element.addAtribute("同名的属性名","值") 修改同名的属性值
Element.setText("内容") 修改文本内容
删除
Element.detach(); 删除标签
Attribute.detach(); 删除属性
3 xPath技术
3.1 引入
问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!!
3.2 xPath作用
主要是用于快速获取所需的节点对象。
3.3 在dom4j中如何使用xPath技术
1)导入xPath支持jar包 。 jaxen-1.1-beta-6.jar
2)使用xpath方法
List<Node> selectNodes("xpath表达式"); 查询多个节点对象
Node selectSingleNode("xpath表达式"); 查询一个节点对象
3.4 xPath语法
/ 绝对路径 表示从xml的根位置开始或子元素(一个层次结构)
// 相对路径 表示不分任何层次结构的选择元素。
* 通配符 表示匹配所有元素
[] 条件 表示选择什么条件下的元素
@ 属性 表示选择属性节点
and 关系 表示条件的与关系(等价于&&)
text() 文本 表示选择文本内容
3.5 案例
用户登录功能:
用户输入用户名和密码 -> 到“数据库”查询是否有对应的用户 ->
有: 则表示登录成功
没有: 则表示登录失败
用xml当做数据库
user.xml 用来存储用户的数据
4 SAX解析
4.1回顾DOM解析
DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树。
对内存要求比较要。
缺点: 不适合读取大容量的xml文件,容易导致内存溢出。
SAX解析原理: 加载一点,读取一点,处理一点。对内存要求比较低。
4.2 SAX解析工具
SAX解析工具- Sun公司提供的。内置在jdk中。org.xml.sax.*
核心的API:
SAXParser类: 用于读取和解析xml文件对象
parse(File f,
DefaultHandler dh
)方法: 解析xml文件
参数一: File:表示 读取的xml文件。
参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类
例如:{
1.创建SAXParser对象
SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
2.调用parse方法
parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());
} [一个类继承class 类名(extends DefaultHandler) 在调用是创建传进去
DefaultHandler类的API:
void startDocument() : 在读到文档开始时调用
void endDocument() :在读到文档结束时调用
void startElement(String uri, String localName, String qName, Attributes attributes) :读到开始标签时调用
void endElement(String uri, String localName, String qName) :读到结束标签时调用
void characters(char[] ch, int start, int length) : 读到文本内容时调用
============DOM解析 vs SAX解析 ========
DOM解析 |
SAX解析 |
原理: 一次性加载xml文档,不适合大容量的文件读取 |
原理: 加载一点,读取一点,处理一点。适合大容量文件的读取 |
DOM解析可以任意进行增删改成 |
SAX解析只能读取 |
DOM解析任意读取任何位置的数据,甚至往回读 |
SAX解析只能从上往下,按顺序读取,不能往回读 |
DOM解析面向对象的编程方法(Node,Element,Attribute),Java开发者编码比较简单。 |
SAX解析基于事件的编程方法。java开发编码相对复杂。 |
总结:
1)Dom4j修改xml文档
new XMLWrier();
......
2)xPath技术: 快速查询xml节点
selectNodes()
selectSinglNode();
xpath表达式语言
3) SAX解析
SAXParser parse
parser()
DefaultHandler类:
startElement();
characters();
endElement();
练习:
设计一个通讯录程序
联系人: 编号 姓名 性别 年龄 电话 QQ 邮箱
功能要求:
添加联系人
修改联系人
删除联系人
查询所有联系人
要求:
1)交互使用console(控制台)
2)数据存储到xml文件(作为“数据库”)(使用dom4j)
提示:
启动程序
================
【1】添加联系人
【2】修改联系人
【3】删除联系人
【4】查询所有联系人
【Q】退出程序
==================
输入 1:
请输入编号:
请输入姓名:
请输入年龄
。。。。
添加成功! -> 数据保存在xml中
输入2
。。。。。。
输入4
编号 姓名 年龄 。。。。
001 张三 30
002 李四 20 。。。
。。。。。
6、XML(2)的更多相关文章
- 归档 Archive、解档Unchive、 XML(一)
1 使用归档的方式保存文件 1.1 问题 归档是任何对象都可以实现的更常规的方式,可以进行归档的对象需要实现NSCoding协议,而且每个实例变量应该是基本数据类型或者是实现NSCoding协议的某个 ...
- 5、XML(1)
1 XML入门 1.1 引入 HTML: 负责网页的结构 CSS: 负责网页的样式(美观) Javascript: 负责在浏览器端与用户进行交互. 负责静态的网页制作的语言 HTML语言特点: 1)由 ...
- 深入了解三种针对文件(JSON、XML与INI)的配置源
深入了解三种针对文件(JSON.XML与INI)的配置源 物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonCon ...
- Hive介绍、安装(转)
1.Hive介绍 1.1 Hive介绍 Hive是一个基于Hadoop的开源数据仓库工具,用于存储和处理海量结构化数据.它是Facebook 2008年8月开源的一个数据仓库框架,提供了类似于SQL语 ...
- UML的类图关系分为: 关联、聚合/组合、依赖、泛化(继承)
UML的类图关系分为: 关联.聚合/组合.依赖.泛化(继承).而其中关联又分为双向关联.单向关联.自身关联:下面就让我们一起来看看这些关系究竟是什么,以及它们的区别在哪里. 1.关联 双向关联:C1- ...
- Qt之XML(一) DOM
Qt之XML(一) 文档名称 Qt之XML 创建时间 2012-10-10 修改时间 2012-10-10 创建人 Baifx 简介(收获) 最近开始使用QtXml,学习了一番,写了几个小测试程序 ...
- [置顶] Android学习系列-Android中解析xml(7)
Android学习系列-Android中解析xml(7) 一,概述 1,一个是DOM,它是生成一个树,有了树以后你搜索.查找都可以做. 2,另一种是基于流的,就是解析器从头到尾解析一遍xml文件. ...
- SpringMVC单文件上传、多文件上传、文件列表显示、文件下载(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文详细讲解了SpringMVC实例单文件上传.多文件上传.文件列表显示.文件下载. 本文工程 ...
- XML系列之--创建电文格式的XML(一)
关于XML,学校那会,老师在口中仅仅提及,自己也未曾深入接触过,仅是些将最基本XML文件内容显示在web定义的表格中之类的简单操作,如今项目中的收发电文涉及到复杂XML的操作.趁此契机好好回顾下XML ...
随机推荐
- Java 杨辉三角的简单实现
package com.lf.trianglenumber; public class Test { public static void main(String[] args) { // 打印的行数 ...
- electron Uncaught ReferenceError: jQuery is not defined
用electron写桌面程序时 ui部分的html页面引入的js会用到jquery 用常规的方式引入是不行的,会抛出如题的异常 <script type="text/javascrip ...
- freemark 判断是否为空 是否存在
<!--1\---><!--判断aaa是否不为空,eclipse插件老报错.---><#if aaa??> ${aaa}</#if><!--2\ ...
- String的replaceAll方法中的正则表达式用法
项目里面 需要对已手机号码进行 如下的显示 比如15088688388 要显示为150****8388的效果 实现这个简单的效果 方法有很多 我想试试用正则表达式去实现 查了点资料最终试出来以下方法可 ...
- python 安装扩展库
直接使用pip安装时非常慢,而且还非常容易失败.通过在网上查找,发现可以使用镜像安装,如下: pip install xxx -i http://pypi.douban.com/simple/ 但是在 ...
- CollectionView添加头尾部
//上下拉头尾部 self.collectionView.footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self ref ...
- Android Support Font 安卓系统支持字体(配图)
测试了一台安卓机器,发现所有字体显示都一样.
- Aptana Studio3开发Python和Ruby(最佳工具)
即从: http://d1iwq2e2xrohf.cloudfront.net/tools/studio/standalone/3.3.1.201212171919/win/Aptana_Studio ...
- bzoj3304 [Shoi2005]带限制的最长公共子序列
dp,时间复杂度O(n^3),f[i][j][k]表示a串到i,b串到j的时候,匹配了c串的k位,要用滚动数组 代码 #include<cstring> #include<algor ...
- struts配置通配符*来匹配方法,实现动态调用
01:web.xml中配置,启动struts2 <?xml version="1.0" encoding="UTF-8"?> <web-app ...