java 之 xml

一、xml的应用
*不同的系统之间传输数据
*用来表示生活中有关的数据
*经常用来配置文件
二、xml的语法
(1)xml的文档声明
*创建一个文件 后缀名(.xml)
*第一步:创建后必须要有一个文档声明,这个声明必须是第一行
**<?xml version="1.0" encoding="gbk" standalone="yes"?>
属性:
version: xml的版本1.0 和 1.1 高版本不能像低版本兼容
encoding:xml编码 gbk utf-8 iso8859(不包含中文)
standalone:表示是否是独立文件,是否需要依赖其他文件 yes或no
*xml的中文乱码问题解决
若是通过文件创建修改后缀名,输入内容后进行保存文件(此时这个文件默认的编码是gbk),而内容中encoding='utf-8',这样打开后就乱码了
(2)定义元素
*标签定义有开始必须要有结束<myTip></myTip>
*标签中没有内容,可以在标签内结束<myTip/>
*标签可以嵌套
*在xml中把空格和换行抖当成那内容来解析 下面案例两端代码是不一致的
** <myTip>123</myTip>

<myTip>
123
</myTip>
*xml代码区分大小写
*xml标签不能以数字和下划线开头
*标签不能以xml,XML,Xml等开头 不正确案例:<xmla>等
*标签不能包含空格和冒号
(3)定义属性
*xml是标记型文档也可以有属性(html也是标记型文档有属性) 例如:<person id1="123" id2="hah"></person>
*在同一个标签中属性名称不能重复
*属性之使用""包起来
*xml属性名称规范和定义元素规范是一致的
(4)注释
*写法:<!-- -->
(5)特殊字符
* 特殊字符 代码符号
& &amp;
< &lt;
> &gt;
" &quot;
' &apos;
(6)CDATA区(了解)
*例如 <b>if(a<b && b<c && d>f)</b>这儿需要转义的太多,如果把这内容放到CDATA区,那么就不需要转义了
*写法:<![CDATA[ 内容 ]]> 例如:<![CDATA[<b>IF(A>B && B<C){}</b>]]> 
*这里是不需要将特殊符号进行转义,CDATA当成了文本内容,不是标签
(7)PI指令(处理指令)(了解)
*可以在xml中设置样式
*写法:<?xml-stylesheet type="text/css" href="hah.css"?>
*设置样式:只能对英文标签起作用,中文名不行
三、xml的约束DTD
案例:若只想写person只包含name,age,然后又写了phone,但是我们需要约束除了name,age外,其他都不能写
*xml约束技术:dtd约束和schema约束
(1)dtd入门
*创建一个文件,后缀名(.dtd)
*通过xml判断出现多少元素(分为简单元素【没有子元素】,复杂元素【有子元素】)就在<!ELEMENT 元素>
*简单元素:<!ELEMENT name (#PCDATA)>
*复杂元素:<!ELEMENT person (name,age)>
*在xml文件中引用:<!DOCTYPE 根元素【注:例如person是根元素】 SYSTEM "文件名.dtd路径">
*xml通过浏览器打开,浏览器只是效验xml语法,不负责效验约束,若想效验xml约束,需要使用工具例如eclips
(2)dtd引入的三种方式
*引入外部的dtd
<!DOCTYPE 根元素 SYSTEM "dtd文件路径">
*内部使用dtd
语法:<!DOCTYPE 根元素 [
<!ELEMENT person (name,age)>........等<!ELEMENT age (#PCDATA)>
]>
*使用网络上的dtd文件
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
后面会学到框架 struts2 使用配置文件 使用外部的dtd文件
(3)使用dtd定义元素
*语法:<ELEMENT 元素名 约束>
*简单元素:<!ELEMENT name (#PCDATA)>
**(#PCDATA):约束name是字符串类型
**EMPTY:元素为空(没有内容).
语法:<!ELEMENT 元素名 EMPTY> 案例:<!ELEMENT name EMPTY> <name></name>
**ANY:用于制定元素内容可以使用任意数据类型 案例:<!ELEMENT name ANY> <name>123</name>
*复杂元素:<!ELEMENT person (name,age)> 【注:当这么写时,name只能再元素中出现一次 案例:<name>hah</name>】
**逗号隔开:表示必须按照声明顺序去编写xml文档 案例:<name>hah</name><age></age>
**竖线隔开:表示任选其一 语法:<!ELEMENT person (name|age)> 案例:<name></name>
*不同符号表示子元素出现的次数
*‘+’符号:表示一次或者多次 语法: <!ELEMEENT person (name+,age)> 案例:<name>hah</name><name>hah2</name>
*‘?’符号:表示零次或者一次 语法:<!ELEMENT person (name?,age)>
*‘*’符号:表示零次或者多次 语法:<!ELEMENT person (name*,age)>
(4)dtd定义属性
*语法:<ATTLIST 元素名称
属性名称 属性类型 属性的约束
>
*属性类型:
*CDATA:字符串
*枚举: 案例:(aa|bb|cc)【用此内容替代CDATA就是这样的写法,在使用时,属性值必须是aa,bb,cc值之一】
*ID:值只能是字母或下划线开头
*属性约束:
* #REQUIRED:该属性必须出现
* #IMPLIED:属性可有可无
* #FIXED:表示固定值 写法: #FIXED "AAA" 【注:属性的值必须是“AAA”】
* 默认值:根据语法规则,若不对属性赋值,那么就是默认值 语法案例:CDATA "WWW",若对属性赋值了,则取的就是赋的值

(5)实体的定义
*语法:<!ENTITY 实体名称 “实体的值”>
*案例<!ENTITY TEST "HAHAHA"
*使用案例:&实体名称; 例如: &TEST; <name>&TEST;</name>
*注意:定义实体需要写在内部dtd里面,如果写在外部的dtd里面,在某些浏览器下,内容得不到
四、xml的解析简介
*xml是标记型文档
*js使用dom解析标记型html文档?
*根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象
*document对象,element对象,属性对象,文本对象,Node节点对象
*xml的解析方式:dom和sax
*dom解析方式优缺点:注:根据xml层级结构在内存中分配一个树形结构,把xml标签,属性,文本都封装成对象
*缺点:解析xml时,若果文件过大,造成内存溢出
*优点:很方便实现增删改操作
*sax解析及方式优缺点:注:使用事件驱动,边读边解析,从上到下一行一行解析,解析到某一个对象,就把对象名称返回
*优点:使用sax不会造成内存溢出,实现查询
*不能实现增删改操作
工具:针对dom和sax方式的解析器,通过api提供
*sun公司:提供jaxp
*dom4j组织:提供dom4j(***实际开发中***)
*jdom组织:jdom(dom4j包含了jdom)
w3cSchool训练题

-----------------------dtd文件---------
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>

<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>



------------------------根据dtd文档在xml中写出格式
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person SYSTEM "hah.dtd">
<TVSCHEDULE NAME="AAA">
   <CHANNEL CHAN="BBB">
      <BANNER>1111</BANNER>
      <DAY>
          <DATE>2222</DATE>
          <HOLIDAY>3333</HOLIDAY>
          <PROGRAMSLOT VTR="CCC">
              <TIME>4444</TIME>
              <TITLE RATING="DDD" LANGUAGE="EEE">555</TITLE>
              <DESCRIPTION>6666</DESCRIPTION>
          </PROGRAMSLOT>
      </DAY>
   </CHANNEL>
</TVSCHEDULE>

 

posted @ 2018-03-07 21:48  zmztyas  阅读(188)  评论(0编辑  收藏  举报