xml_dtd约束

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(了解)
 

猜你喜欢

转载自blog.csdn.net/weixin_42061805/article/details/81587541