一.xml基础
1.xml的简介
(1)概念:eXtensible Markup Language - 可扩展标记型语言
标记型语言: html是标记型语言 也是使用标签来操作 可扩展: html里面的标签是固定,每个标签都有特定的含义 标签可以自己定义 可以写中文的标签 <persion></persion>.<猫></猫>
(2).xml的用途
A.html是用于显示数据 xml也可以显示数据(不是主要功能)
B.xml主要功能,为了存储数据
(3).xml的其他了解
- xml是w3c组织发布的技术
- xml有两个版本 1.0 1.1
- 使用都是1.0版本,(1.1版本不能向下兼容)
2.xml的应用
(1).不同的系统之间传输数据
A.qq之间数据的传输
(2).用来表示生活中有关系的数据
(3).经常用于配置文件
A.比如现在连接数据库 肯定知道数据库的用户名和密码,数据名称 B.如果修改数据库的信息,不需要修改源代码,只要修改配置文件就可以了
3.xml的语法
(1)xml的文档声明
A.创建一个文件 后缀名是.xml
B.如果写xml,第一步必须要有一个文档声明(写了文档声明之后,表示写xml文件的内容)
C.<?xml version="1.0" encoding="gdk"?> //version 版本 encoding 编码方式
注意:文档声明必须写在第一行第一列
(2).属性
- version:xml的版本 1.0(使用) 1.1
- encoding:xml的编码 gbk uft-8 iso8859-1(不包含中文)
- standalone:是否需要依赖其他文件 yes/no
(3).xml的中文乱码问题解决
保存时候的编码和设置打开时候的编码一致,就不会出现乱码
(4)定义元素(标签)
(5)定义属性
(6)注释
(7)特殊字符
(8)CDATA区
(9)PI指令(了解)
4.xml的元素(标签)定义
(1).标签定义
A.标签定义有开始必须要有结束:<persion></persion>
B.标签没有内容 可以在标签内结束 <aa/>
C.标签可以嵌套 必须要合理嵌套
a.合理嵌套 `<aa><bb></bb></aa>`
b.不合理嵌套 `<aa><bb></aa></bb>`这种方式是不正确的
D.一个xml中 只能有一个根标签 其他标签都是这个标签下面的标签
E.在xml中把 空格和换行都当成内容来解析
比如 下面这两段代码含义是不一样的
<aa>111</aa>
<aa>
111
</aa>
F.xml标签可以是中文
(2).xml中标签的命名规则
A.xml代码区分大小写
<p></P>:这两个标签是不一样的
B.xml的标签不能以数字和下划线(_)开头
<2a> <_aa>:这样是不正确的
C.xml的标签不能以xml,XML,Xml等开头
<xmla></xmlB><XMLC>:这些都是不正确的
D.xml的标签不能包含空格和冒号
<a b><b:c>:这些都是不正确的
5.xml中属性的定义
(1).html是标记型文档 可以有属性
(2).xml也是标记型文档 可以有属性
<person id1="aa" id2="bbb"></person>
(3).属性定义的要求
A.一个标签上可以有多个属性
<person id1="aaa" id2="bbb"></person>
B.属性名称不能相同
C.属性名称和属性值之间使用=,属性值使用引号包起来(可以使单引号,也可以是双引号)
D.xml属性的命名规范和元素的命名规范相同
6.xml中的注释
(1).写法
注意:注释不能嵌套 注释也不能放到第一行,第一行第一列必须放文档声明
7.xml中的特殊字符
如果想要在xml中显示 a<b 不能正常显示 因为把<当做标签
如果就想要显示,需要对特殊字符 < 进行转义
< <
> >
" " ' ' & &
8.CDATA区
可以解决多个字符都需要转义的操作 if(a<b && b<c && d>f){}
把这些内容放到CDATA区里面,不需要转义了
(1).写法
<![CDATA[ 内容 ]]>
把特殊字符 当做文本内容 而不是标签
9.PI指令(处理指令)
可以在xml中设置样式
设置样式,只能对英文标签名称起作用 对于中文的标签是不起作用的
(1).写法
<?xml-stylesheet type="text/css" href="css的路径"?>
二.xml的约束
1.xml的约束
(1).为什么需要约束?
比如现在定义一个person的xml文件 只想要这个文件里面保存人的信息,比如name age等 但是如果在xml文件中写一个标签<猫> 发现可以正常显示 因为符合语法规范 但是猫不是人的信息 xml的标签是自定义的,需要技术来规定xml中只能出现的元素 这个时候需要约束。
(2).xml的约束的技术
A.dtd的约束
B.schema约束
2.dtd的快速入门
(1).创建一个文件
A.后缀名.dtd
(2).步骤
A.看xml中有多少个元素,有几个元素,在dtd文件中写几个<!ELEMENT>
B.判断元素是简单元素还是复杂元素
<!ELEMENT 元素名称 (
<!ELEMENT 元素名称 (子元素)>
C.需要在xml文件中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd文件的路">
(3).注意
A.打开xml文件使用浏览器打开的 浏览器只负责校验xml的语法,不负责校验约束
B.如果想要校验xml的约束 需要使用工具(eclipse-EE 或者 myeclipse)
3.dtd的三种引入方式
(1).引入外部的dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd路径">
(2).使用内部的dtd文件
<!DOCTYPE 根元素[ <!ELEMENT person (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]>
(3).使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
struts2框架就是 使用配置文件 使用 外部的dtd文件
4.使用dtd定义元素
(1).语法
<!ELEMENT 元素名 约束>
A.简单元素:没有子元素的元素
<!ELEMENT name (#PCDATA)>
(#PCDATA):约束name是字符串类型
EMPTY:元素为空(没有内容)
ANY:任意
- 实例:
因为标签dog定义是空 而里面是123 所以报错
B.复杂元素:有子元素的元素
<!ELEMENT person (name,age,sex,school)>
<!ELEMENT 根元素 (子元素)>
这个地方的?代表name这个标签在person标签内要么不出现 要么就出现1次 以上就是出现两次 所有才报错的
5.使用dtd定义属性
(1).语法
<!ATTLIST 元素名称 属性名称 属性类型 属性的约束 >
(2).属性类型
A.CDATA:字符串
B.枚举:表示只能在一定的范围内 出现值 但是只能每次出现其中的一个 (aa|bb|cc)
C.ID: 值只能是字母或者下划线开头
(3).属性的约束
A.#REQUIRED: 属性必须存在
B.#IMPLIED: 属性可有可无
C.#FIXED: 表示一个固定值 #FIXED “AAA”
属性的值必须是设置的这个固定值
D.直接值
不写属性 使用直接值 写了属性,使用设置那个值
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [ <!ELEMENT person (name,age,sex,nameid,school,dog)> <!ELEMENT name (#PCDATA)> <!ATTLIST name ID CDATA #REQUIRED > <!ELEMENT age (#PCDATA)> <!ATTLIST age ID1 ID #IMPLIED > <!ELEMENT sex (#PCDATA)> <!ATTLIST sex ID4 CDATA "sex" > <!ELEMENT nameid (#PCDATA)> <!ELEMENT school (#PCDATA)> <!ATTLIST school ID3 CDATA #FIXED "成都东软学院" > <!ELEMENT dog ANY> <!ATTLIST dog ID2 (a|b|c) #REQUIRED > ]>
<person>
<name ID="ab">张三</name>
<age>20</age>
<sex>男</sex>
<nameid>15311110901</nameid>
<school>xxx学院</school>
<dog ID2="a">狗</dog>
</person>
下面的代码运行效果如下:
6.实体的定义
(1).语法
<!ENTITY 实体名称 "实体的值">
使用实体 &实体名称; 比如 &TEST;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [ <!ELEMENT person (nameid)> <!ELEMENT nameid (#PCDATA)> <!ENTITY TEST "15311110842"> ]>
<person>
<nameid>&TEST;</nameid>//打印出来标签内的值就是15311110842
</person>
(2).注意
定义实体需要写在内部dtd里面,如果写在外部的dtd里面,有某些浏览器下,内容得不到
三.xml的解析
1.xml的解析
(1).xml是标记型文档
(2).js使用dom解析标记型文档?
根据html的层级结构 在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象 document对象,element对象,属性对象,文本对象,Node节点
2.xml的解析方式:dom和sax
(1).过程
(2).dom方式解析
根据xml的层级结构在内存中分配一个树形结构 把xml的标签,属性和文本都封装成对象 缺点:如果文件过大 造成内存溢出 优点:很方便实现增删改操作
(3).sax方式解析
采用事件驱动,边读边解析 从上到下,一行一行的解析,解析到某一个对象,返回对象名称 缺点:不能实现增删改操作 优点:如果文件过大,不会造成内存溢出,方便实现查询操作
(4).解析器
想要解析xml 首先需要解析器 不同的公司和组织提供了 针对dom和sax方式的解析器 通过api方式提供 sun公司提供了针对dom和sax解析器 jaxp dom4j组织 针对dom和sax解析器 dom4j(* 实际开发中 *) jdom组织 针对dom和sax解析器 jdom
3.jaxp的api的查看
(1).jaxp是javase的一部分
(2).jaxp解析器在jdk的javax.xml.parsers包里面
四个类:分别是针对dom和sax解析使用的类
A.dom:
DocumentBuilder:解析器类 这个类是一个抽象类 不能new 此类的实例是可以从DocumentBuilderFactory.newDocumentBuilder()方法来获取 一个方法 可以解析xml parse (“xml路径”) 返回是 Document整个文档 返回的document是一个接口,父节点是Node,如果在document里面找不到想要的方法,到Node里面去找
在document里面方法:
getElementsByTagName(String tagname)
createElement(String tagName)
createTextNode(String data)
appendChild(Node newChild)
removeChild(Node oldChild)
replaceChild(newNode,oldNode)
getParentNode()
NodeList:
getLength()
item(int index)
DocumentBuilderFactory:解析器工厂 这个类也是一个抽象类,不能new newInstance()获取DocumentBuilderFactory的实例
B.sax:
SAXParser:解析器类 SAXParserFactory:解析器工厂
四.jaxp解析实例
1.基本操作步骤
(1).创建解析器工厂 (2).根据解析器工厂创建解析器 (3).解析xml返回document (4).得到所有的xxx元素
2.基本操作步骤代码实现
DocumentBuilderFactory documentBuilderFactory=
DocumentBuilderFactory.newInstance()
DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder()
Document document=documentBuilder.parse("xxx.xml")
NodeList nodeList=document.getElementsByTagName("xxx") (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|