XML (eXtensible Markup Language,可扩展标记语言)可以定义自己的一组标签,使人们或程序能够理解这些标签.
XML包含以下几部分:
例如:
<?xml version='1.0' encoding="gb2312"?> ★①
<!DOCTYPE ★②
CUSTOMER[
<!ENTITY FIRSTFLOOR "唐宁街 15 号 1 楼"> ★③
<!ENTITY SECONDFLOOR "唐宁街 15 号 2 楼">
]
>
<CUSTOMERS> ★④
<CUSTOMER>
<NAME> 成龙 </NAME>
<ADDRESS> &FIRSTFLOOR; </ADDRESS>
<PHONE>5715746</PHONE>
</CUSTOMER>
<CUSTOMER>
<NAME>阿诺德</NAME>
<ADDRESS>&SECONDFLOOR;</ADDRESS>
<PHONE>6865863</PHONE>
</CUSTOMER>
</CUSTOMERS>
====================================================
说明:
★①XML声明 :
这里声明的XML版本为1.0,编码格式为 "gb2312"
★②XML文档类型定义
<!DOCTYPE >类似于关键字,这里是对CUSTOMER节点定义文档类型,定义好的类型,只能在CUSTOMER节点中使用,否则会报错。
注意,XML严格区分大小写,所以DOCTYPE不能写错了。
★③XML实体定义
<!ENTITY>也是关键字,在一对[]中可以定义实体,就像是键值对的定义,前面是键值,后面是对应的值,这样可以在下面的文档中
通过键值引用具体的值。
★④XML文档元素
通过一对标签可以把具体的值存储在文档中,要存储上面定义好的实体需要 &符号,然后引用实体的键值,并以;号结束。
例如这里的&FIRSTFLOOR;,其实存储的是上面定义好的"唐宁街 15 号 1 楼"。
现在看一下,通过dtd文件来定义XML
例如:
== Example 3.xml ==
<?xml version = "1.0" encoding="gb2312"?>
<!DOCTYPE book SYSTEM "Example3.dtd"> ★①
<book>
<details>
<name>xml 使用详解</name>
<author>成龙来自&country;</author>
<publication>Mac &rights;</publication>
<price>&pricenotation;50</price>
</details>
<details>
<name>xml 揭密</name>
<author>Raghu 来自&count;</author>
<publication>Mac &rights;</publication>
<price>&pricenotation;45</price>
</details>
</book>
== Example3.dtd ==
<?xml version = "1.0" encoding="gb2312"?>
<!ELEMENT book (details+)> ★②
<!ELEMENT details ( name, author, publication, price)> ★③
<!ELEMENT name (#PCDATA)> ★④
<!ELEMENT author (#PCDATA)>
<!ELEMENT publication (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ENTITY country "中国"> ★⑤
<!ENTITY count "印度">
<!ENTITY rights "版权所有">
<!ENTITY pricenotation "$">
====================================================
说明:
★①
这里仍然是XML文档类型定义,只是在定义的时候用的是外部的dtd文件。这里就得严格的按照dtd定义的格式来书写XML。
SYSTEM就是导入外部的dtd文件。
★②
这里定义了一个根节点 "book" 他的子节点为 "details",这里的+号表示可以有多个子节点。如果去掉这个+号,表示子节点就只能有
一个,否则就会报错。
★③
这里是为details节点定义下级节点,分别为:name, author, publication, price
★④
这里是为子节点定义具体的类型,可以有两种定义,一种是#PCDATA,表示是要被解析器解析的,一般的定义都是#PCDATA。另一种是
#CDATA,在CDATA内部的所有内容都会被解析器忽略。CDATA全称character data,翻译为字符数据。我们在写XML文档时,
有时需要显示字母,数字和其它的符号本身,比如"<",而在XML中,这些字符已经有特殊的含义,我们怎么办呢?
这就需要用到CDATA语法。语法格式如下: <![CDATA[这里放置需要显示的字符]]>
例如:
<![CDATA[<AUTHOR sex="female">ajie</AUTHOR>]]>
在页面上显示的内容将是"<AUTHOR sex="female">ajie</AUTHOR>"
★⑤
这里就很熟悉了,就是在定义实体,和上面的用法是一样的。
现在来看一下怎样通过dtd文件来定义XML的属性
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE movies
[ ★①
<!ELEMENT movies (movie+)>
<!ELEMENT movie (title?,actor+,rating*)>★②
<!ELEMENT title (#PCDATA)>
<!ELEMENT actor (#PCDATA)>
<!ELEMENT rating (#PCDATA)>
<!ATTLIST movie type CDATA #IMPLIED> ★③
]
>
<movies>
<movie type="冒险片">
<title> 空中监狱 </title>
<actor> 尼古拉斯 凯奇</actor>
<rating>家长指引</rating>
</movie>
<movie type="恐怖片">
<title> 幽灵 </title>
<actor> 黛米 摩尔</actor>
<actor> 帕特里克 斯韦兹</actor>
<rating>家长指引</rating>
</movie>
</movies>
====================================================
说明:
★①
这里是内嵌的dtd文件,和外部的dtd文件没有任何区别
★②
注意 "actor+" 这里表示actor节点可以有多个,"title?"表示title节点只可使用一次或者不使用,"rating*"rating节点可以
表示使用一次,多次,或者根本不使用。
★③
这里是重点,<!ATTLIST>就是给节点配置属性的,这里是给 "movie"节点配置属性叫 "type","#REQUIRED"表示此属性是不可省略的,
必须要有,否则就报错了,"#IMPLIED"表示的正好相反,表示可以省略。
再来看看dtd文件文件中定义元素时的变量的运用
== Example6.dtd ==
<?xml version="1.0" encoding="gb2312" ?>
<!ENTITY % p "a"> ★①
<!ELEMENT roster ((%p;)+)> ★②
<!ELEMENT %p; (name,sex,birthday,score?,skill+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
<!ELEMENT score (#PCDATA)>
<!ELEMENT skill (#PCDATA)>
<!ATTLIST %p; sign ID #REQUIRED> ★③
== teacher.xml ==
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE roster SYSTEM "Example6.dtd" [
<!ENTITY % p "teacher"> ★④
]>
<roster>
<teacher sign="t101">
<name>张老师</name>
<sex>女</sex>
<birthday>1968.3.1</birthday>
<skill>Java</skill>
<skill>Oracle</skill>
<skill>C Sharp</skill>
<skill>SQL Server</skill>
</teacher>
</roster>
== student.xml ==
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE roster SYSTEM "Example6.dtd" [
<!ENTITY % p "student"> ★⑤
]>
<roster>
<student sign="s101">
<name>李华</name>
<sex>男</sex>
<birthday>1978.9.12</birthday>
<score>98</score>
<skill>Java</skill>
<skill>Oracle</skill>
<skill>C Sharp</skill>
<skill>SQL Server</skill>
</student>
</roster>
====================================================
说明:
★①
这里定义了实体,和普通的定义实体没什么不同,区别在于这里定义的是个变量,"% p"是变量名,"a"是默认值。
★②
给根节点"roster" 定义子节点,这里用到了变量,注意引用变量的格式: " %p; ",一定要以;号结束。
★③
给变量节点定义属性,这里的属性名是sign,属性的类型是ID型,表示sign的值不能重复,#REQUIRED表示不可缺省。
这里要说一下属性的类型:
一般有三种常用的类型。
第一个是ID。它要求属性的值在文档中不重复。使用过数据库的人都知道唯一标志符的必要性。DTD ATTLIST语句看起来象这样:
<!ATTLIST element_name attribute_name ID #REQUIRED>
很难想象没有#REQUIRED缺省值的ID属性类型。如果那样,任何重复的或空的ID都会迫使处理器返回一个错误。
ID必须以字母或下划线开始并且不能包含任何空格。
NMTOKEN类型也使用上面的命名规则。但是允许重复。它被用做传递数据给应用程序的保障。大多数程序语言,
包括Java和JavaScript,在模块名中不能有空格。大多数情况下,最好保证属性符合它们的规则。
最后是枚举类型,不需要特定的关键字。而是用"|"符号包含在括号内的值,例如:
<!ATTLIST sibling (brother | sister) #REQUIRED>
★④
这是在XML中,用具体的节点将dtd文件文件中定义节点变量替换掉。
★⑤
这里的作用与上面是一样的,这样的好处是多个XML可以对应一个dtd文件,但前提是这些XML的格式与结构是一样的。
现在来看一下XML的命名空间
XML文档可以创建自定义的元素和属性词汇来描述数据。当XML文档较为复杂或是需要从别的地方取得内容时,
一个文档中有可能会需要不止一个词汇,这样就会产生名称相同而含义不同的元素出现在不同词汇中的情况,这时候就需要导入命名空间。
XML 命名空间提供了一个通过与由 URI 引用确定的命名空间相联系的简单方法来保证在XML文档中的元素和属性名字的合法性。
命名空间可以指明哪个元素属于哪个词汇。它可以为每个词汇指定唯一的前缀进行识别,再将该前缀应用于XML文档中的元素上。
<?xml version=“1.0” encoding=“gb2312” ?>
<sample xmlns:ins="http://www.Aptech_edu.org" xmlns:="http://www.tea.org"> ★①
<ins:batch-list>
<ins:batch>夜班培训批次</ins:batch>★②
<ins:batch>早班培训批次</ins:batch>
<ins:batch>午班培训批次</ins:batch>
<ins:batch>
第一批茶
<tea:batch> ★③
批号 333
</tea:batch>
</ins:batch>
<ins:batch>
第二批茶
<tea:batch>
批号 222
</tea:batch>
</ins:batch>
</ins:batch-list>
</sample>
====================================================
说明:
★①
这里在根节点里面通过 "xmlns:"关键字引入命名空间,应用名为ins,另一个引用名为tea,那么在下面的文档中就可以通过引用名来
区分batch了。
★②
这里是对"http://www.Aptech_edu.org"命名空间的batch进行引用
★③
这里是对"http://www.tea.org"命名空间的batch进行引用
值得注意的是,URI并不一定需要指向一个实际的文档或目录。对它仅有的要求就是,在XML文档中它必须是唯一的。
然而很多处理程序,包括XML模式、XHTML和XSLT处理程序,都使用URI来注明它们必须处理文档的某一部分。
因此,对于这些应用程序需要使用正确的URI。