* 可扩展的标记语言
* 标签是自定义的
* 和HTML类似
* XML是用来传输数据,不是显示数据
* XML的版本:
* XML1.0(使用) XML1.1(不向下兼容)
* XML的常见应用
* 作为框架的配置文件
* 系统与系统之间进行数据的传输
* json
* webservice soap XML
* 文档声明
* <?xml version="1.0" ?>
* 出现在文档的第一行第一列的位置
* 属性:
* version = "1.0" xml的版本 必须要写的
* encoding="UTF-8" XML的编码集 可选的
* standalone="yes/no" 代表xml文件是否是独立的 如果是no,不独立,引入外部的文件。(如果不写,没有问题) 可选的
* 乱码
* 产生的原因:保存文件时和打开文件时采用的编码不一致。
* 解决办法:保证保存文件和打开文件编码一致即可。
* 元素(标签)
* 分为开始和结合标签
* 包含标签主体 <abc>文本内容</abc>
* 不包含标签主体 <abc/>
* 不能交叉嵌套
* 只能有一个根节点
* 命名规范
* 区分大小写 错误的:<a></A>
* 不能以数字和中划线开头 错误的:<1a> <-a>
* 不能以(XML xml Xml) 开头
* 元素中不能包含空格和冒号
* 属性
* XML使用双引号或者单引号
* 属性不能重复
* 命名规范和元素相同
* 注释
* 和HTML的注释相同的
* <!-- XML的注释 -->
* 不能嵌套
* 特殊字符
* < <
* & &
* > >
* " "
* ' '
* CDATA区
* 作用:把中间内容当前普通文本内容
* 语法:
<![CDATA[
文本内容
]]>
* PI(处理指令)(了解)
* 为什么是约束:
<myspring>
<bean>cn.itcast.login</bean>
</myspring>
* 两个概念
* 格式良好的XML
* 有效的XML
* 快速入门步骤
* 定义元素
* <!ELEMENT 元素名称 元素类型(后指定) >
* 判断元素是复杂还是简单元素
* 如果是简单元素
元素类型(#PCDATA)
* 如果是复杂元素
元素类型(子元素名称)
* 引入XML的文件中
* <!DOCTYPE 根节点 SYSTEM "DTD的地址" >
demo1
DTD代码:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!ELEMENT 书架 (书)>
3 <!ELEMENT 书 (书名,作者,售价,简介)>
4 <!ELEMENT 书名 (#PCDATA)>
5 <!ELEMENT 作者 (#PCDATA)>
6 <!ELEMENT 售价 (#PCDATA)>
7 <!ELEMENT 简介 (#PCDATA)>
xml文件
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE 书架 SYSTEM "book.dtd">
3
4 <书架>
5 <书>
6 <书名>javaweb开发大全</书名>
7 <作者>hah</作者>
8 <售价>99.8元</售价>
9 <简介>这书不错啊</简介>
10 </书>
11 </书架>
* 可以在XML的文件的内部编写DTD的代码
* 格式:
<!DOCTYPE 根节点 [
DTD的代码
]>
* 引入本地DTD的文件(经常使用)
* 格式 <!DOCTYPE 根节点 SYSTEM "DTD文件的地址">
* 引入网络的DTD的文件(不常使用)
* <!DOCTYPE 根节点 PUBLIC "DTD文件的名称" "DTD文件的地址">
demo2 为第二种引入方式
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE 书架 [
3 <!ELEMENT 书架 (书)>
4 <!ELEMENT 书 (书名,作者,售价,简介)>
5 <!ELEMENT 书名 (#PCDATA)>
6 <!ELEMENT 作者 (#PCDATA)>
7 <!ELEMENT 售价 (#PCDATA)>
8 <!ELEMENT 简介 (#PCDATA)>
9
10
11 ]>
12
13 <书架>
14 <书>
15 <书名>javaweb开发大全</书名>
16 <作者>hah</作者>
17 <售价>99.8元</售价>
18 <简介>这书不错啊</简介>
19 </书>
20
21 </书架>
* <!ELEMENT 元素名称 元素类型>
* 元素类型
* (#PCDATA) 可解析的字符数据(字符串)
* EMPTY 空的
* ANY 任意的
* (子节点名称) 子节点
* 子元素
* 子元素直接的关系
* , 子元素是按顺序出现
* | 是或的关系
* 子元素出现的次数
* + 子元素出现1次或多次
* * 子元素出现0次或多次
* ? 子元素出现0次或1次
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
* <!ATTLIST 元素名称
属性名称 属性类型 属性约束
属性名称 属性类型 属性约束
>
* 属性类型
* CDATA 字符串
* 枚举 写法:(值1|值2)
* ID 代表唯一的值,不能重复,不能只写数字
* 属性约束
* #REQUIRED 必须出现的
* #IMPLIED 属性是可选的
* #FIXED 固定值 (#FIXED "值")
* 默认值(不常用)
demo
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE 书架 [
3 <!ELEMENT 书架 (书+)>
4 <!ELEMENT 书 (书名,作者,售价,简介)>
5 <!ELEMENT 书名 (#PCDATA)>
6 <!ELEMENT 作者 (#PCDATA)>
7 <!ELEMENT 售价 (#PCDATA)>
8 <!ELEMENT 简介 (#PCDATA)>
9
10 <!ATTLIST 书
11 出版社 CDATA #FIXED "北大出版社"
12 出版日期 (2014-11-7|2014-11-5) #REQUIRED
13 编号 ID #REQUIRED
14 >
15
16 <!ENTITY username "张三">
17
18 ]>
19
20 <书架>
21 <书 编号="b" 出版日期="2014-11-5">
22 <书名>javaweb开发大全</书名>
23 <作者>&username;</作者>
24 <售价>99.8元</售价>
25 <简介>这书不错啊</简介>
26 </书>
27 <书 编号="b2" 出版社="北大出版社" 出版日期="2014-11-7">
28 <书名>葵花宝典</书名>
29 <作者>越不群</作者>
30 <售价>99.8两</售价>
31 <简介>欲练此功...</简介>
32 </书>
33 </书架>
* <!ENTITY 别名 "值">
* 引入该实体 &别名;
* schema
* 区别:
* 解析XML的技术有哪些?
* 解析XML的技术有很多,主要使用DOM和SAX两种技术?
* DOM和SAX的区别:
* DOM解析XML会在加载整个文档到内存中,形成树状结构。
* 缺点:如果文档过大,容易产生内存溢出的问题。
* 优点:可以做增删改的操作
* SAX解析是基于事件驱动和事件处理器的,边读边解析。
* 优点:不会产生内存溢出的问题。
* 缺点:不能做增删改的操作(但是如果使用DOM4J可以做该操作)
* 几种提供解析XML的jar包
* JAXP SUN提供的 (标准)
* DOM4J DOM4J提供的 (企业应用最多)
* JDOM JDOM提供的 (不讲)
JAXP的DOM解析demo
xml 文件:
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <书架>
3 <书>
4 <书名>javaweb开发大全</书名>
5 <作者>班长</作者>
6 <售价>99.8元</售价>
7 <简介>这书不错啊</简介>
8 </书>
9 <书>
10 <书名>葵花宝典</书名>
11 <作者>越不群</作者>
12 <售价>99.8两</售价>
13 <简介>欲练此功...</简介>
14 </书>
15 </书架>
解析:
1 package test;
2
3 import javax.xml.parsers.DocumentBuilder;
4 import javax.xml.parsers.DocumentBuilderFactory;
5 import javax.xml.parsers.ParserConfigurationException;
6 import javax.xml.transform.Transformer;
7 import javax.xml.transform.TransformerFactory;
8 import javax.xml.transform.dom.DOMSource;
9 import javax.xml.transform.stream.StreamResult;
10
11 import org.w3c.dom.Document;
12 import org.w3c.dom.Element;
13 import org.w3c.dom.Node;
14 import org.w3c.dom.NodeList;
15
16 /**
17 *
18 * @author Angus
19 * Dom解析
20 */
21 public class JaxpDomTest {
22 public static void main(String[] args) {
23 try {
24 run1();
25 } catch (Exception e) {
26 // TODO Auto-generated catch block
27 e.printStackTrace();
28 }
29 }
30
31
32 /**
33 * 添加子节点
34 * 需求:在第二本书下添加子节点
35 * @throws Exception
36 */
37 public static void run2() throws Exception{
38 // 创建解析器对象的工厂
39 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
40 // 获取解析器对象
41 DocumentBuilder builder = factory.newDocumentBuilder();
42 // 解析XML 获取document对象
43 Document document = builder.parse("src/book2.xml");
44 // 创建元素
45 Element cat = document.createElement("猫");
46 // 设置文本
47 cat.setTextContent("我是猫");
48 // 先获取第二本书
49 Node book2 = document.getElementsByTagName("书").item(1);
50 // 把元素添加到书的下面
51 book2.appendChild(cat);
52 // 回写
53 // 获取回写类的工厂
54 TransformerFactory transformerFactory = TransformerFactory.newInstance();
55 // 获取回写类
56 Transformer transformer = transformerFactory.newTransformer();
57 // 进行回写操作
58 transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml"));
59 }
60 /**
61 * 获取书名的文本内容
62 * @throws Exception
63 */
64 public static void run1() throws Exception{
65 //获取解析器对象工厂类
66 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
67 //获取解析器对象
68 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
69 //解析xml文档,返回document对象
70 Document document = documentBuilder.parse("src/book2.xml");
71 //获取书名标签
72 NodeList nodeList = document.getElementsByTagName("书名");
73 //遍历
74 for (int i = 0; i<nodeList.getLength(); i++) {
75 Node node = nodeList.item(i);
76 System.out.println(node.getTextContent());
77 //javaweb开发大全 葵花宝典
78 }
79 }
80 }