dtd的简单入门
示例:
<?xml version="1.0" encoding="gbk"?>
<China>
<ShaanXi>陕西</ShaanXi>
<ShanXi>山西</ShanXi>
</China>
1.确定xml文件有几个元素(标签)
<!ELEMENT>
<!ELEMENT>
<!ELEMENT>
2.区分元素是复杂元素还是简单元素
简单元素:无子元素的元素
复杂元素:有子元素的元素
<!ELEMENT China (ShaanXi,ShanXi)>
<!ELEMENT ShaanXi (#PCDATA)>
<!ELEMENT ShanXi (#PCDATA)>
3.再xml文件中引入dtd文件
<!-- 规则 -->
<!-- <!DOCTYPE 根元素名称 SYSTEM "dtd文件路径"> -->
<!DOCTYPE China SYSTEM "test.dtd">
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE China SYSTEM "test.dtd">
<China>
<ShaanXi>陕西</ShaanXi>
<ShanXi>山西</ShanXi>
</China>
注意:在浏览器中打开xml文件,只负责检验语法规则是否正确,不负责校验约束条件。(要想看到约束条件是否正确,需要借助软件MyEclipse)
dtd的三种引入方式
1.就是上边的示例(这里是引用外部的本地dtd文件,下面还有引用外部的网络dtd文件)
2.文件内部的引入方式
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE China [
<!ELEMENT China (ShaanXi,ShanXi)>
<!ELEMENT ShaanXi (#PCDATA)>
<!ELEMENT ShanXi (#PCDATA)>
]>
<China>
<ShaanXi>陕西</ShaanXi>
<ShanXi>山西</ShanXi>
</China>
3.引用外部的网络dtd文件
<!DOCTYPE 根元素名称 PUBLIC "dtd名称" "dtd文件的URL">
使用dtd定义元素
1.简单元素
(#PCDATA):字符串类型
<!ELEMENT ShaanXi (#PCDATA)>
EMPTY:标签内内容为空
<!ELEMENT ShaanXi EMPTY>
ANY:任意类型
<!ELEMENT ShaanXi ANY>
2.复杂元素
<!ELEMENT China (ShaanXi,ShanXi)>
以下符号表示子元素出现的个数:
+:子元素出现一次或者多次
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE China [
<!ELEMENT China (ShaanXi+,ShanXi)>
<!ELEMENT ShaanXi (#PCDATA)>
<!ELEMENT ShanXi (#PCDATA)>
]>
<China>
<ShaanXi>关中</ShaanXi>
<ShaanXi>陕北</ShaanXi>
<ShanXi>山西</ShanXi>
</China>
?:子元素出现0次或者1次
<!ELEMENT China (ShaanXi+,ShanXi?)>
*:子元素出现0次或者多次
<!ELEMENT China (ShaanXi*,ShanXi)>
子元素之间的分隔符所代表的含义
,:元素出现的顺序只能按照分割的顺序出现,不能颠倒
|:若干元素只能出现一个元素
dtd定义属性
格式:
<!ATTLIST 元素名称
属性名称 属性类型(CDATA,枚举,ID) 属性的约束()
>
属性类型:
1.CDATA:子符串类型
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE China [
<!ELEMENT China (ShaanXi+,ShanXi)>
<!ELEMENT ShaanXi (#PCDATA)>
<!ATTLIST ShaanXi
STR CDATA #REQUIRED
>
<!ELEMENT ShanXi (#PCDATA)>
]>
<China>
<ShaanXi STR="guanzhong">关中</ShaanXi>
<ShaanXi STR="shanbei">陕北</ShaanXi>
<ShanXi>山西</ShanXi>
</China>
2.枚举类型:
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE China [
<!ELEMENT China (ShaanXi+,ShanXi)>
<!ELEMENT ShaanXi (#PCDATA)>
<!ATTLIST ShaanXi
MJ (guanzhong|shanbei|shannan) #REQUIRED
>
<!ELEMENT ShanXi (#PCDATA)>
]>
<China>
<ShaanXi MJ="guanzhong">关中</ShaanXi>
<ShaanXi MJ="shanbei">陕北</ShaanXi>
<ShaanXi MJ="shannan">陕南</ShaanXi>
<ShanXi>山西</ShanXi>
</China>
3.ID,表示属性的取值不能相同,值只能是字母和下划线开始
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE China [
<!ELEMENT China (ShaanXi+,ShanXi)>
<!ELEMENT ShaanXi (#PCDATA)>
<!ATTLIST ShaanXi
ID1 ID #REQUIRED
>
<!ELEMENT ShanXi (#PCDATA)>
]>
<China>
<ShaanXi ID1="guanzhong">关中</ShaanXi>
<ShaanXi ID1="shanbei">陕北</ShaanXi>
<ShanXi>山西</ShanXi>
</China>
错误示范:
<ShaanXi ID1="shanbei">陕北</ShaanXi>
<ShaanXi ID1="shanbei">陕南</ShaanXi><!-- 错误!!!属性值相同 -->
属性约束类型:
属性约束类型 | 作用 |
#REQUIRED | 属性必须存在 |
#IMPLIED | 属性可有可无 |
#FIXED | 属性拥有一个固定的值 格式:属性名称 属性类型 #FIXED “固定值” |
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE China [
<!ELEMENT China (ShaanXi+,ShanXi)>
<!ELEMENT ShaanXi (#PCDATA)>
<!ATTLIST ShaanXi
STR ID #REQUIRED
>
<!ELEMENT ShanXi (#PCDATA)>
<!ATTLIST ShanXi
STR CDATA #FIXED "shanxi"
>
]>
<China>
<ShaanXi STR="guanzhong">关中</ShaanXi>
<ShaanXi STR="shanbei">陕北</ShaanXi>
<ShaanXi STR="shannan">陕南</ShaanXi>
<ShanXi STR="shanxi">山西</ShanXi>
</China>
实体的定义
格式:<!ENTITY 实体名称 "实体内容">
引用方式:&实体名称;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE China [
<!ELEMENT China (ShaanXi)>
<!ELEMENT ShaanXi (#PCDATA)>
<!ENTITY TEST "陕西">
]>
<China>
<ShaanXi>&TEST;</ShaanXi>
</China>
xml的解析
解析的方式:dom、sax
优缺点:
方式 | 优点 | 缺点 |
dom | 增删改查非常方便 | 如果文件过大,造成内存溢出 |
sax | 采用事件驱动,边读变解析 | 不能实现增删改操作 |
xml的解析器:
jaxp、dom4j、jdom(了解)