xml基础

一.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).写法
<!-- xml的注释-->

注意:注释不能嵌套 注释也不能放到第一行,第一行第一列必须放文档声明

7.xml中的特殊字符

如果想要在xml显示 a<b 不能正常显示 因为把<当做标签
如果就想要显示,需要对特殊字符 < 进行转义
<  &lt;
>  &gt;
" &quot; ' &apos; & &amp;

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 元素名称 (#PCDATA)>
  • 复杂元素:有子元素的元素
<!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次
以上就是出现两次 所有才报错的

  • 表示子元素出现的次数

    • +:表示出现一次或者多次
    • ?:表示出现零次或者一次
    • *:表示任意次(0次或者多次)
  • 子元素之间使用逗号进行隔开逗号隔开表示元素出现的顺序 元素顺序与标签内不一致会报错

  • 子元素之间使用|进行隔开 表示只能出现其中的任意一个

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)//这个方法可以得到标签 返回集合NodeList
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");//xml路径 

               NodeList nodeList=document.getElementsByTagName("xxx");//xxx为所操作的标签名字 

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念