Java Xml
- 掌握xml的语法
- 了解xml的体系
- 掌握xml的解析技术
- 掌握DOM和SAX
xml技术概述
为什么使用xml?
问题1:因为各平台之间的程序很难交流。
用java跨平台解决部分
问题2:各程序之间很难传输数据(要达到无二义性)
用普通文本解决。
xml -概念
eXtended Markup Language
是区分大小写的
a.可扩展的标记语言
b.设计用来传输和存储数据
c.允许开发人员自定义标签的名字,但是要符合一定的规范
xml和html的区别
a.xml不是html的替代,他们两个有各自的功能
b.xml设计用来传输和储存数据,重点在于数据
c.html设计用来显示数据,重点是数据的显示
xml文档组成
1.xml声明
<?xml version = "1.0" encoding = "UTF-8" ?>
还有个属性是 standalone 文档定义是否在一个文件内
默认yes
2.处理指令
<?xml-stylesheet type ="text/xsl" href = "路径"?>
3.文档类型定义
4.注释
和html注释一样,不要把注释放在标记中间。注释也不能嵌套。注释最好不要放在第一行!
5.根元素
有且只有一个根元素,是完全包括元素的元素。
6.子元素(是一个对象)
7.属性
8.属性值
<![CDATA[
只要写在里面的内容,都会被看成文本,不管使用到标记没有。
写的是什么样,解析出来就是什么样。但是不能输入"]]>"
]]>
结构完整的xml文档
- 必须有xml声明语句
- 必须有且仅有一个根元素
- 标记大小写敏感
- 属性值用引导
- 标记成对
- 空标记关闭
- 元素正确嵌套
元素语法:
- 名称可以包含字母数字或者其他符号
- 但是不能以数字和下划线开头
- 不能以XML/xml等等
- 名字中不能有空格
- 名称中也不能有冒号(冒号留给命名空间使用)
xml技术体系
1.文档描述和校验技术:DTD和Schema 用来定义xml结构,和用于校验我们书写的xml文档是否符合规范。
2.文档转换技术(xsl/xslt)
xml 最大的特点是内容和格式分离,xml不包含如何显示数据,xsl解决了xml数据显示的问题。
xsl,xslt可以随意将xml文档转换为html,pdf文档。
3.文档查询技术(xPath/XQuery)
类似数据库和sql之间的关系
4.文档解析技术(XML DOM/SAX)
DOM是文档对象模型,定义了一组接口,这组接口可以用来解析或者创建xml文档。并且是基于对象,与平台和语言无关的。
特点:整个文档必须在内存解析和储存,对大型的文档来说耗内存,占用资源严重(会造成内存紧张)。数据都在内存,获取数据效率高。
SAX是xml简单应用程序的接口,sax解析文档是基于事件驱动的方式,sax使用回调机制来通知桌面应用程序。
特点:基于事件驱动模型,标签一个一个解析,开始标签和结束标签对应不同的事件。不会将整个文档加载到内存。所以说,占用内存少不会浪费内存资源。
缺点:要到达指定的位置,只能按照顺序处理,不能随机访问。sax只读(无法修改)。文档且只能遍历一次。
5.文档链接和定位技术(Xlink/XPointer)
文档定位技术,可以定位节点和节点集。
解析xml的方法
DOM,SAX
DOM4J:比较常用的技术。第三方提供的解析技术,所以必须要导入jar包。
创建一个xml文件
1.通过DocumentHelper 通过类产生一个文档对象
Document doc = DocumentHelper.createDocument();
2.通过document 对象创建一个根元素
Element userElement = document.addElement("user");
3.创建一个注释
userElement.addComment("this is user");
4.创建一个子节点
Element username = userElement.addElement("username");
5.给节点创建属性
username.addAttribute("id","username");
6.设置文本值
usename.setText("asd123131");
7.添加文档类型
document.addDocType("根元素","","文件名字");
8.设置输出格式
OutputFormat fomat =OutputFormat.createPrettyPrint();
format.setEncoding("gbk");
9.将创建好的xml内容输出到硬盘
File f = new File("c:/"+File.separator+"dom4j.xml")
XMLWriter xw = new XMLWriter(new FileOutputStream(f),format);
xw.write(userElement);
10.通过sax读取到文件对象
SAXReader saxRead = new SAXReader();
Document doc = saxRead.read(new File("dom4j.xml"));
11.修改属性值
获取节点属性
//username/@class
表示找到username节点找到class属性
,没有@符号表是元素
List list = document.selectNodes("//username/@class");
Iterator it = list.iterator;
while(it.hasnext()){
//获取到的是属性对象
Attribute attr = (Attribute)it.next();
//获取到属性的名字和值
attr.getName();
attr.getValue();
//设置属性的值
attr.setValue("xxxx");
}
12.修改元素的值
List list = document.selectNodes("//username/firstName");
Iterator it = list.iterator; while(it.hasnext()){
//获取到的是元素对象
Element elu = (Element)it.next();
//获取到元素的名字和文本值
elu.getName();
elu.getText();
//设置文本的值
elu.setText("xxxx");
}
13.修改过后需要再写入文件
操作和之前一样
DTD文档(文档类型定义)
全称:document type definition
主要用来约束xml文档书写的规范。 也把dtd 称为 xml的约束
常用的约束:
1. xml DTD(javaweb)
2. xml Scheme(javaee)
引入dtd文件 ,对当前xml文件进行约束
<!DOCTYPE 根元素名 (PUBLIC/SYSTEM)"(如果是SYSTEM)文件路径">
PUBLIC:如果写public表示约束的文件来自于网络文件
后面会有2个内容:第一个表示dtd的名字,第二个表示url
SYSTEM:表示约束条件来自于本地的DTD文件,直接找到路径
书写DTD文档
DTD对元素的约束:
<!ELEMENT 元素(子元素1+,子元素2+)>
表示当前根元素下面允许存在根元素这一个子节点,可以存在一个或者多个
<!ELEMENT 元素 (#PCDATA)>
表示允许当前元素节点下面可以出现任何文本元素
符号的含义:
1.+ : 表示该对象可以出现一次或者多次
2.* :表示该对象允许出现0次或者多次
3.? : 表示对象允许出现0次或者一次
4., :表示当前的内容必须按照顺序出现。
5.#PCDATA : 表示名字里面可以放任意文本。
6.| : 表示当前的内容可以不管顺序,可以出现可以不出现
DTD对属性的约束:
<!ATTLIST 元素名称 属性的名字 类型 属性的特点>
eg:
<!ATTLIST username id CDATA #IMPLIED >
表示username 的属性 id的值可以是任意字符, 可以给id可以不给id
对于属性类型的解释:
- CDATA : 表示属性值可以是任何字符(数字和字母)
- ID :表名属性的值必须是唯一的,但是属性的值不能是以数字开头
- IDREF/IDREFS : 设计外键的时候
属性的特点:
- #REQUIRED : 表示属性必须给,不给就报错
- #IMPLIED :表示属性可以给 可以不给
- #FIXER VALUE :表示属性值必须是VALUE
- DEFAULT VALUE : 表示属性如果没有值就默认给VALUE