xml 简介
* eXtensible Markup Language : 可扩展标记性语言
** 标记型语言 : html 是标记性语言
- 也是使用标签来操作
** 可扩展:
- html 里面的标签是固定,每个标签都有特定的含义
- 标签可以自己定义,可以写中文的标点
* xml 用途
** HTML是用于显示数据,xml 也可以显示数据(不是主要功能)
** xml 主要功能,为了存储数据
* xml w3c 组织发布的技术
* xml有两个版本1.0 1.1
- 使用都是1.0 版本,(1.1版本不能向下兼容)
xml 的应用
* 不同的系统之间传输数据
* 用来表示生活中有关系的数据
* 经常用在文件配置
* 比如连接数据库 连接数据库的配置信息
xml 语法
1. xml的文档声明 **
* 创建一个文件 后缀名 .xml
* 第一步必须要有一个文档声明(写了文档声明之后,表示xml文件的内容)
** <?xml varsion="1.0" encoding="gbk"?>
*** 文档声明必须写在第一行
* 属性
- version:xml 的版本 1.0 (使用)1.1
- encoding:xml编码 gbk utf-8 iso8859-1(不包含中文)
- standalone:是否需要依赖其他文件 yes/no
* xml 中文乱码解决
* 保存修改编码格式
* 保存和编写的编码格式一致.
2. 定义元素(标签) **
3. 定义属性 **
4. 注释 **
5. 特殊字符 **
6. CDATA区(了解)
7. PI 指令(了解)
5. xml 元素的定义
** 标签定义
** 标签定义又开始必须要有结束
** 标签没有内容,可以在标签内结束
** 标签可以嵌套,必须要合理嵌套
** 一个xml 中,只能有一个根标签
** 在xml 中吧空格和换行都当成内容来解析
** xml 标签可以是中文
** xml 中标签的命名规则
1.区分大小写.
2. 不能以数字和下划线开头(_)
3. 不能以xml、XML、Xml开头
4. 不能包含空格和冒号
6.xml 中属性的定义
* HTML是标记型文档,可以有属性
* xml也是标记型文档,可以有属性
** 属性定义的要求
1. 一个标签上可以有多个属性
2. 属性名称不能相同
3. 属性名称和属性值之间使用 = ,属性值使用引号包起来
4. 命名规范和标签的命名规范相同
7. xml 中的注释
* 写法 <!-- 注释 -->
** 注意的地方
*** 注释不能嵌套注释
** 注释不能放到第一位
8. xml 特殊字符
* 如果xml 中显示a<b ,不能正常显示,因为吧<当前标签
& &
< <
> >
9. CDATA区
* 可以解决多个字符都需要转移的操作 if(a<b && b<c && d>f)
* 不需要转移
** 写法
<![CDATA[内容]]> # 普通文本内容
10. PI指令(处理指令)
* 可以在xml 设置样式
* 写法: <?xml-stylesheet type="text/css" href="some.css" ?> 引入css样式
* 设置样式,只对英文标签起作用,对于中文的标签名不起作用
** xml 的语法的总结
所有的xml 元素都必须有关闭标签
xml 标签大小写敏感
xml 必须有正确的嵌套顺序
xml 文档必须有根元素(只有一个)
xml 的属性值需要加引号
特殊字符需要转移 -- CDATA
xml 中的空格、回车换行会解析时被保留
11. xml的约束
* 为什么需要约束 ?指定传输的文件格式,和标签定义。
* xml的约束的技术 : dtd约束和schema约束(看懂)
12. dtd 的快速入门
* 创建一个文件 后缀名 .dtd
步骤:
1.看xml 中有多少个元素 ,有几个元素,在dtd文件中写几个<!ELEMENT>
2. 判断元素时简单元素还是复杂元素
- 简单元素:没有子元素
<!ELEMENT 元素名称 (#PCDATA)>
- 复杂元素:有子元素的元素
<!ELEMENT 元素名称(子元素名称)>
3. 需要在xml 文件中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd文件路径">
** 打开xml 文件使用浏览器打开的,浏览器只负责校验xml的语法,不负责校验约束
** 想要xml 约束 ,需要使用工具(myeclipse工具)
13 . dtd的三种引入方式
1. 引入外部的dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd路径">
2. 内部的dtd文件
<!DOCTYPE 根元素 [ 定义 ]>
3. 使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
- 后面需要框架 struts2 使用配置文件 使用外部的dtd文件
14. 使用dtd定义元素
* 语法 : <!ELEMENT 元素名 约束>
* 简单元素 : 没有子元素的元素
<!ELEMENT name (#PCDATA) >
*** (#PCDATA): 字符串
*** EMPTY: 必须为空(没有内容)
*** ANY : 任意内容
* 复杂元素:
<!ELEMENT person (name+|age?,sex*,school)
- 子元素只能出现一次
* <!ELEMENT 元素名称(子元素)>
* 表示子元素出现的次数
+ : 表示一次或者多次
?: 0次或者一次
* : 0 次或者多次
* 子元素直接使用逗号隔开
* 表示元素出现的顺序
* 子元素直接使用|隔开
** 表示元素只能出现任意一个
15. 使用dtd定义属性
* 语法: <!ATTLIST 元素名称
属性名称 属性类型 属性的约束
>
例子:<!
ATTLIST birthday (aa|bb|cc) #REQUIRED
>
* 属性类型
- CDATA #REQUIRED 字符串
- 枚举 :表示只能在一定的范围内出现值,但是只能出现的其中的一个
** 红绿灯效果
**(aa|BB|CC)
- ID : 值只能是字母或下划线开头
* 属性的约束
- #REQUIRED : 属性必须存在
- #IMPLIED : 属性可有可无
- #FIXED : 表示一个固定值 #FIXED "abc"
- 直接值 :默认值
* 不写属性,使用直接值
<!ATTLIST school ID5 "WWW" >
16. 实体的定义
* 语法 : <!ENTITY 实体名称 “实体的值”>
*** <!ENTITY TEST "HHAHAH">
***使用实体 &实体名称; 比如:&TEST;
** 注意
* 定义实体需要写在内部dtd里面 ,如果写在外部的dtd里面,有些浏览器下,内容得不到
17. xml的解析的简介 (写到java代码)(****今天最重要的内容****)
* xml 是标记型文档
* js使用dom解析标记型文档?
- 根据html 的层级结构,在内存中分配一个树形结构,吧html 的标签,属性和文本都封装成对象
- document对象、element对象、属性对象、文本对象、Node节点对象
* xml的解析方式(技术):dom和sax
** 画图分析
区别:
dom : 根据xml的层级机构 ,在内存中分配一个树形结构,把xml中每部分都封装成对象
* 缺点:
使用dom方式解析xml时 ,如果文件过大,会造成内存溢出
* 优点:
很方便的实现增删改操作
sax : 解析过程:
采用事件驱动,边读边解析
从上到下,一行一行的解析,解析到某一个对象,把对象名称返回
* 优点:
使用sax方式不会造成内存溢出,实现查询
* 缺点:
使用sax方式,不能实现增删改操作
* 想要解析xml ,首先需要解析器
** 不同的公司和组织提供了针对dom和sax方式的解析器,通过api方式提供
*** sun 提供了针对dom和sax解析器 jaxp
*** dom4j 组织,针对dom和sax 解析器 dom4j (*** 使用最多 **) (包含jdom)
*** jdom 组织 ,针对 dom和sax解析器 jdom
18. jaxp 的api的查看
** jaxp 是javaSE的一部分
** jaxp 解析器在jdk的javax.xml.parsers 包里面
** 四个类 :分别是针对dom和sax解析使用的类
*** dom:
DocumentBuilder :解析器类
- 这个类是一个抽象类,不能new
DocumentBuilderFactory.newDocumentBuilder() 方法获取
- 一个方法,可以解析xml parse("xml路径") 返回是Document 整个文档
- 返回的document是一个接口,父接口是Node,如果document没有要操作的方法,可以去Node里寻找需要使用的方法。
- 在document 里面的方法 org.w3c
getElementsByTagName(String tagName); 得到标签
查看jdk帮助文档
DocumentBuilderFactory:解析器工厂
- 这个类也是一个抽象类,不能new
newInstance() 获取DocumentBuilderFactory实例
*** sax:
SAXParser:解析器类
SAXParserFactory:解析器工厂
19. 使用Jaxp 实现简单的查询
* 查询xml 中所有的name元素的值
* 步骤
// 查询所有name 元素的值
/*
1. 创建解析器工厂
DocumentBuilderFactory.newInstance();
2. 根据解析器工厂创建解析器
builderFactory.newDocumentBuilder;
3.解析xml 返回document
Document document = builder.parse("src/person.xml");
4. 得到所有的name元素
docuemnt.getElementsByTagName("name");
5. 返回集合,遍历集合,得到每一个name元素
- 遍历 getLength() item()
- 得到元素里面值 使用 getTextContent();
*
*/
* 查询xml中第一个name元素的值
/*
1. 创建解析器工厂
DocumentBuilderFactory.newInstance();
2. 根据解析器工厂创建解析器
builderFactory.newDocumentBuilder;
3.解析xml 返回document
Document document = builder.parse("src/person.xml");
4. 得到name元素
NodeList list = document.getElementsByTagName("name")
5. 使用返回结合,里面的方法item ,下标获取到具体的元素
Node name1 = list.item(0);
6. 得到具体的值,使用getTextContent方法
name1.getTextContent()
*/
20. 使用jaxp添加节点
*** 在 第一个p1 下面(末尾) 添加<sex>nv</sex>
/*
1. 创建解析器工厂
DocumentBuilderFactory.newInstance();
2. 根据解析器工厂创建解析器
builderFactory.newDocumentBuilder;
3.解析xml 返回document
Document document = builder.parse("src/person.xml");
4. 得到第一个p1
- 得到所有p1,使用item方法下标得到
Ndoe p1 = document.getElementsByTagName("p1").itme(0);
5.创建sex标签 createElement
Element sex1 = document.createElement("sex");
6. 创建文本createTextNode
Text text1 = document.createTextNode("nv");
7. 把文本添加到sex下面的appendChild
sex1.appendChild(text1);
8. 把sex 添加到第一个p1 下面
p1.appendChild(sex1)
9. 回写xml
TransformerFactory transformerFactory = TransformerFactory.newTransformerFactory;
Transformer transformer = TransformerFactory.newTransformer();
transformer.transform(new DOMSource(document),new StreamResult("src/person.xml"));
*/
21. 使用jaxp 修改节点 修改第一个p1下面的sex内容是nan
1. 创建解析器工厂
DocumentBuilderFactory.newInstance();
2. 根据解析器工厂创建解析器
builderFactory.newDocumentBuilder;
3.解析xml 返回document
Document document = builder.parse("src/person.xml");
4. 得到sex item 方法
Ndoe sex1 = document.getElementsByTagName("sex").itme(0);
5. 修改set里面的值setTextContent 方法
sex1.setTextContent("nan")
6.回写xml
TransformerFactory transformerFactory = TransformerFactory.newTransformerFactory;
Transformer transformer = TransformerFactory.newTransformer();
transformer.transform(new DOMSource(document),new StreamResult("src/person.xml"));
22. 使用jaxp 删除节点 删除sex>nan 节点
1. 创建解析器工厂
DocumentBuilderFactory.newInstance();
2. 根据解析器工厂创建解析器
builderFactory.newDocumentBuilder;
3.解析xml 返回document
Document document = builder.parse("src/person.xml");
4. 获取到sex 节点信息
Node sex1 = document.getElementsByTagName("sex").item(0);
5. 获取到sex 父节点
Node p1 = sex1.getparentNode();
6. 使用父节点删除 removerChild方法
p1.removerChild(sex1);
7. 回写xml
TransformerFactory transformerFactory = TransformerFactory.newTransformerFactory;
Transformer transformer = TransformerFactory.newTransformer();
transformer.transform(new DOMSource(document),new StreamResult("src/person.xml"));
23. 使用jaxp 遍历节点
** 把xml 中的所有元素名称打印出来
1. 创建解析器工厂
DocumentBuilderFactory.newInstance();
2. 根据解析器工厂创建解析器
builderFactory.newDocumentBuilder;
3.解析xml 返回document
Document document = builder.parse("src/person.xml");
== 使用递归实现 ====
4. 得到根节点
5. 得到根节点的子节点
6. 打印信息
list1(document)
//遍历的方法
private static void list1(Node node){
// 判断当前元素的类型 打印操作
if(node.getNodeType()==Node.ELEMENT_NODE){
pringln(ndoe.getNodeName());
}
// 得到一层子节点
NodeList list = node.getChildNodes();
// 遍历list
for(int i=0;i<list.getLength();i++){
//得到每一个节点
Node node1 = list.item(i);
// 使用递归操作
list1(node);
}
}
微笑的java
欢迎关注转发评论点赞沟通,让编码不在孤单。