3.xml的应用
(1)不同系统之间传输数据
qq之间数据的传输
画图分析过程
(2)用来表示生活中有关系的数据
(3)经常用在配置文件中
比如现在连接数据库,肯定要知道用户名和密码,数据名称等
如果修改数据库的信息,不需要修改源代码,只要修改配置文件就可以了
4.xml的语法
(1)xml的文档说明
创建一个文件,后缀名: .xml
如果写xml,第一步必须要有一个文档声明(写了文档声明之后,表示写xml文件内容)
<?xml version=”1.0” encoding=”utf-8”?>
必须写在第一行第一列
属性:
version: xml的版本 1.0 1.1
encoding: xml编码 gbk utf-8
standalone: 说明文档是否独立存在(很少使用)
xml乱码问题
原因:保存文件的编码格式和xml的文档设置encoding编码不一致
(2)定义元素(标签)
(3)定义属性
(4)注释
(5)特殊字符
(6)CDATA区
(7)PI指令
5.xml的元素定义
标签定义:
有开始必须要有结束 :
标签没有内容,可以在标签内结束:
标签可以嵌套,必须要合理嵌套
合理嵌套:
不合理嵌套:
一个xml中,只能有一个根标签,其它都是子标签。
在xml中把空格和换行都当成内容来解析,下面这两段代码含义是不一样的
1111
标签的命名规则
(1) 代码区分大小写
(2) 不能以下划线和数字开头
(3) 不能以XML, xml, Xml开头
(4) 不能包含空格
(5) 可以是中文
6.xml中属性的定义
xml是标记型文档,可以有属性。
例如:
属性定义的要求
(1)一个标签上可以有多个属性
(2)属性名称不能相同
(3)属性名称和属性值之间使用“=”,属性值用引号引起来(单引号,双引号)
(4)属性名称的命名规则遵循标签的命名规则
7.xml的注释
写法:<!—注释内容 —>
注意:注释不能嵌套!
注释也不能放在第一行第一列,第一行第一列必须放文档声明!
8.xml的特殊字符
& &
< <
> >
” "
’ '
9.CDATA区
可以解决多个字符都需要转义的操作 例如:if(af){}
把这些内容放到CDATA区里面,则不需要转义了
写法:
<![CDATA[内容]]>
作用:把特殊字符,当做文本内容,而不是标签。
10.PI指令(处理指令) 【了解】
可以在xml中设置样式
<?xml-stylesheet type=”text/css” href=”css的路径”?>
设置样式,只能对英文标签名称起作用,对中文标签不起作用。
11.xml的约束
任何根节点可以有任何子节点,并不符合实际。
例如:
<猫>2132</猫>
son>
xml的约束技术: dtd的约束 schema约束
12.dtd的快速入门
(1)创建一个文件,后缀名:.dtd
(2)看xml中有多少个元素,有几个元素,在dtd文件中就写几个 <!ELEMENT>
按顺序
(3)判断元素是简单元素还是复杂元素
复杂元素:没有子元素
<!ELEMENT 元素名称 (子元素)>
简单元素:有子元素的元素
<!ELEMENT 元素名称 (#PCDATA)>
(4)在xml文件中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM “dtd文件路径”>
(5)使用浏览器打开xml文件,浏览器只负责校验xml的语法,不负责校验的约束
如果说想校验xml的约束,需要使用工具。
13.dtd的三种引入方式
(1)<!DOCTYPE 根元素名称 SYSTEM “dtd路径”>
(2)引入内部的dtd文件
<!DOCTYPE 根元素名称[
<!ELEMENT 根元素名称 (子元素名称1, 子元素名称2)>
<!ELEMENT 子元素名称1 (#PCDATA)>
<!ELEMENT 子元素名称2 (#PCDATA)>
]>
(3) 使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC “dtd名称” “dtd文档的URL”>
后面学到的struts2框架,使用配置文件 使用外部的dtd文件
14.使用dtd定义元素——-
语法:<!ELEMENT 元素名称 约束>
简单元素:没有子元素的元素
<!ELEMENT name (#PCDATA)>
(#PCDATA) : 约束name是字符串
EMPTY : 约束元素为空
ANY : 任意 可为空可不为空
复杂元素:有子元素的元素
<!ELEMENT 根元素名称 (子元素1,子元素2)>
子元素只能出现一次
表示子元素出现的次数:
+ : 子元素出现1次或者多次
? : 子元素出现0次或者1次
: 子元素出现0次或者1次或者多次
子元素之间使用逗号“,”隔开,表示元素出现的顺序
子元素之间使用“|”隔开,表示根元素只能有其中的任意一个子元素
15.dtd定义属性
语法:<!ATTLIST 元素名称
属性名称 属性类型 属性的约束
<
属性的类型:
CDATA : 字符串
<!ATTLIST name
ID1 CDATA #REQUIRED
>
枚举 : 只能出现其中的一个 (aa|bb|cc)
<!ATTLIST age
ID2 (AA|BB|CC) #REQUIRED
>
ID: 值只能是字母或下划线开头
<!ATTLIST birthday
ID3 ID #REQUIRED
>
属性的约束:
#REQUIRED 属性必须存在
#IMPLIED 属性可有可无
#FIXED 表示属性是一个固定值 #FIXED “AAA” 属性可有可无。
直接值: 不写则为默认值,写了则修改。 属性可有可无。
16.dtd中实体的定义
语法:<!ENTITY 实体名称 “实体的值”>
使用:&实体名称;
注意:定义的实体需要写在内部的dtd里面,如果写在外部的dtd里面,在某些浏览器下,内容得不到
17.xml的解析的简介(写到java代码)
xml是标记型文档。js使用dom解析标记型文档。
根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装出对象。Document对象,element对象,Node节点对象,属性对象,文本对象。
xml解析的技术: dom和sax
dom解析:(根据xml的层级结构在内存中分配一个树形结构,把xml的标签,文本和属性都封装成对象)
优点:方便实现增删改查
缺点:容易造成内存溢出
sax解析:(采用事件驱动,边读别解析) 从上到下,一行一行解析,解析到某个对象,把对象名称返回。
优点:不会造成内存溢出,实现查询
缺点:不能实现增删改的操作
想要解析xml,首先需要解析器
不同的公司和组织提供了 针对dom和sax方式的解析器
(1)sun公司提供了针对dom和sax解析器 jaxp
(2)dom4j组织提供了针对dom和sax解析器 dom4j(实际开发中)
(3)jdom组织提供了针对dom和sax解析器 jdom
18.jaxp中的Dom的api的查看
Dom解析器在jdk的javax.xml.parsers包里面
四个类:分别是针对dom和sax解析使用的类
Dom:
DocumentBuilder : 解析器
(1)这个类是一个抽象类,不能new对象
此类的实例可以从DocumentBuilderFactory.newDocumentBuilder()方法获取
(2)Parse(“xml路径”)返回Document整个文档
返回的Document是一个接口,父接口是Node,如果在Document中找不到的方法,可以到Node中去找。
(3)Documen类的方法:
getElementsByTagName(String tagname)
得到标签,返回集合NodeList
NodeList的遍历:
getLength(): 得到集合的长度
item(int index): 返回Node节点
Node节点的方法:
getTextContent():获取标签里面的内容
createElement(String tagName)
创建标签
createTextNode(String data)
创建文本
Node类的方法:
appendChild(Node newChild)
把文本添加到标签下面
removeChild(Node oldChild)
通过父节点删除子节点
replaceChild(
NodenewChild,
NodeoldChild)
``通过父节点替换子节点
getParentNode()
``获取父节点
` <br /> DocumentBuilderFactory : 解析器工厂<br /> 这个类是抽象类,不能new对象<br />通过静态方法newInstance()来获取DocumentBuilderFactory的实例<br /> <br /> <br />19.使用jaxp中的Dom实现查询的操作<br />要求:打印所有name标签的内容 文件:person.xml<br /> 代码实现:Jaxp.TestJaxp类的Test01()<br /> <br />20.使用jaxp中的Dom添加节点 <br /> <br />要求:<br />在第一个p1末尾添加<sex>nv</sex> 文件:person.xml<br />代码实现:Jaxp.TestJaxp类的Test02()<br /> <br /> <br /> <br />回写文件:<br /> Transformer : 抽象类,不能new对象<br />想要获取Transformer实例,TransformerFactory.newTransformer()获取。<br />方法:<br />transform(Source xmlSource,Result outputTarget)<br />(1)Source是接口,DomSource是其实现类。DOMSource(Node n)<br />(2)Result是接口,StreamResult是实现类。 [**StreamResult**]()
([String]()
systemId)`
TransformerFactory : 抽象类,不能new对象
想要获取TransformerFactory实例,通过静态方法newInstance()获取
new DOMSource(document),new StreamResult(“src/person.xml”));
*
21.使用jaxp中的Dom修改节点
要求:修改第一个p1节点的sex子节点的内容 person.xml
代码实现:Jaxp.TestJaxp类的Test03()
setTextConetent() : (设置)修改标签的内容
22.使用jaxp中的Dom删除节点
要求:删除第一个sex节点 person.xml
代码实现:Jaxp.TestJaxp类的Test04()
23.使用jaxp中的Dom遍历节点
要求:把xml中的所有元素名称都打印出来 person.xml
代码实现:Jaxp.TestJaxp类的Test05()
getNodeName() :获取元素名称
getNodeType() :判断是否是元素类型
node.getNodeType()==Node.ELEMENT_NODE
24.schema约束
schema符合xml语法,xml语句。
一个xml中只能有一个dtd约束,但是可以有多个schema,多个schema使用名称空间区分(类型java包名)
schema可以支持更多的数据类型。
schema语法更加复杂,schema目前不能替代dtd
25.schema的快速入门
创建一个schema文件 后缀名: .xsd
根节点:
根节点属性:
xmlns=http://www.w3.org/2001/XMLSchema
表示当前xml文件是一个约束文件
targetNamespace=http://www.itcast.cn/20151111
使用schema约束文件,直接通过这个地址引入约束文件
elementFormDefault=”qualified”
步骤:
(1)看xml有多少个元素
(2)看简单元素和复杂元素
如果是复杂元素:
子元素
(3)简单元素,写在复杂元素
<element name=
<element name=“age” type=“int”>
(4)在被约束文件里面引入schema约束文件
<person xmlns:xsi=[_http://www.w3.org/2001/XMLSchema-instance](http://www.w3.org/2001/XMLSchema-instance)
— 表示xmls是一个被约束文件
xmlns=http://www.example.org/1
— 约束文档里面的targetNamespace
xsi:schemaLocation=“http://www.example.org/1 1.xsd”>
— targetNamespace(空格) 约束文档的地址路径
额外知识:
定义复杂元素的属性:
写在上面。
use:修饰属性是否要出现
required : 必须出现
26. jaxp中的Sax的api的查看
jaxp解析:在java.xml.parsers包里有2个类
(1) SAXParser :解析器
抽象类,不能new对象。
实例由SAXParserFactory.newSAXParser()方法获得
—parse(File f,DefaultHandler dh)
第一个参数:xml的路径
第二个参数:事件处理器
当把事件处理传递进来,相当于在方法里面绑定了一个事件,自动执行事件,自动执行方法
(2) SAXParserFactory :解析器工厂
抽象类,不能new对象。
实例由newInstance()``方法获得
DefaultHandler类中的三个方法:事件自动执行以下方法(1)
startElement(
Stringuri,
StringlocalName,
StringqName,
Attributesattributes)
接收元素开始的通知
qName: 标签名称
(2)endElement(
Stringuri,
StringlocalName,
StringqName)
``接收元素结束的通知
(3)characters(char[] ch, int start, int length)
接收元素中字符数据的通知
返回文本的内容
new String(ch,start,length)
27.使用Jaxp中的Sax解析xml
sax方式不能实现增删改操作,只能做查询操作
步骤:
1. 创建解析器工厂
2. 创建解析器
3. 执行parse方法
4. 自己创建一个类,继承DefaultHandler
5. 重写DefaultHandler中的startElement,endElement,characters方法
案例1:打印出整个文档
代码实现:Jaxp.TestSax类.Test01()
案例2:打印所有同名标签的值
代码实现:Jaxp.TestSax类.Test02()
28.使用dom4j解析xml
得到Document:
SAXReader reader=new SAXReader();
Docuoment document=reader.read(url);
Document是一个接口,父接口是Node.
Document的方法: getRootElement(): 获取根节点,返回的是Element
Element也是一个接口,父接口是Node.
Node的方法:
getParent(): 获取父节点
addElement() : 添加标签
Element的方法:
element(qname)
获取标签下面的第一个子标签
qname:标签名称
elements(qname)
获取标签下面是这个名称的所有子标签(一层)
qname:标签名称
elements()
获取标签下面的所有一层子标签
获取标签下面的所有一层子标签
29.使用dom4j查询xml
案例1:查询所有name元素的值 person3.xml
步骤:
1. 创建解析器
2. 得到Document
3. 得到根节点
4. 得到所有的p1标签
5. 得到name
6. 得到name里面的值
代码实现:Dom4j.Test01类
案例2:查询第一个name元素的值 person3.xml
步骤:
1. 创建解析器
2. 得到Document
3. 得到根节点
4. 得到第一个p1标签
5. 得到第一个p1下的name元素
6. 得到name里面的值
代码实现:Dom4j.Test01类
30. 使用dom4j添加元素
案例1:在第一个p1标签末尾添加一个元素
代码实现:Dom4j.Test02类
步骤:
1. 创建解析器
2. 得到Document
3. 得到根节点
4. 得到第一个p1标签
5. 在p1下面添加元素
6. 在添加完成后的元素下添加文本
7. 回写xml
31.使用dom4j在特定位置添加元素
案例1:在第一个p1下面的age标签之前添加
person3.xml
代码实现:Dom4j.Test03类
步骤:
1. 创建解析器
2. 得到Document
3. 得到根节点
4. 得到第一个p1标签
5. 获取p1下面的所有元素
elements()获取所有元素,返回list集合
创建元素DocumentHelper.createElement(“元素名”)
使用list里面的方法,在特定位置添加元素
6. 回写xml
32.使用dom4j修改节点的操作
案例1:修改第一个p1下面的age元素的值 person3.xml
代码实现:Dom4j.Test04类
步骤:
1. 创建解析器
2. 得到Document
3. 得到根节点
4. 得到第一个p1标签
5. 得到第一个age元素
6. 修改值为30
7. 回写xml
33.使用dom4j删除节点的操作
案例1:删除第一个p1下面的第一个sex元素 person3.xml
代码实现:Dom4j.Test05类
步骤:
1. 创建解析器
2. 得到Document
3. 得到根节点
4. 得到第一个p1标签
5. 得到第一个sex元素,并通过父节点删除子节点
6. 回写xml
34.使用dom4j来获取元素的属性值
案例1:打印第一个p1的id1属性的值 person3.xml
代码实现:Dom4j.Test06类
35.使用dom4j支持xpath的操作
可以直接获取到某个元素,不需要一层一层的解析
(1)/AAA/DDD/BBB : AAA下面的DDD下面的BBB
(2)//BBB : 名称是BBB的所有元素
(3)/AAA/BBB/ : 在AAA下面的BBB下面的所有元素
(4)// : 所有元素
(5)BBB[1] : 第一个BBB元素
BBB[last()] :最后一个BBB元素
(6)//BBB[@id] : 有id属性的所有BBB元素
36.使用dom4j支持xpath具体操作
默认情况下,dom4j是不支持xpath。需要导入jaxen.jar (dom4j.lib)
在dom4j里面提供了两个方法,支持xpath.
selectNodes(“xpath表达式”)
获取多个节点
selectSingleNode(“xpath表达式”)
获取一个节点
案例1:使用xpath查询xml中所有name元素的值 person3.xml
代码实现:Dom4j.Test07类
37.实现简单的学生管理系统
代码实现:Project包的所有代码