XML构建模块:
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
- 元素、属性、实体、PCDATA、CDATA
<body src="computer.gif">body text in between</body>
这是一个body元素,元素可拥有文本内容和属性 、属性总是以名称/值的形式成对出现,属性值要加引号,不过单引号和双引号均可使用 。
XML中有以下五个预定义实体:当我们需要在文本中表示<
时,就需要转义,不然会破坏XML结构。
当文档被 XML 解析器解析时,实体就会被翻译。
实体引用 | 字符 |
---|---|
< | < |
> | > |
& | & |
" | " |
' | ’ |
PCDATA 的意思是被解析的字符数据(parsed character data)。 一般就是XML元素的文本。PCDATA 是会被解析器解析的,解析器会解析标签,检查实体并转义实体。
比如<body>abc<img>d</body>
里面的lt和gt实体会被翻译,当作纯数据展示,不会破坏xml结构。
CDATA 的意思是字符数据(character data)。不会被解析器解析。
某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。转义成实体太麻烦,不转义又会破坏xml结构,为了避免错误,可以将脚本代码定义为 CDATA。
CDATA 部分由 “<![CDATA[**" 开始,由 "**]]>” 结束,里面的所有内容都会被解析器忽略:
//页面上插入js语句
<script>
<![CDATA[
function matchwo(a,b){
if (a < b && a < 0) then {
return 1;
} else {
return 0;
}
}
]]>
</script>
//mybatis xml中的CDATA
<if test="endDate != null and endDate != ''">
<![CDATA[and DATE_FORMAT(CREATE_DATA,"%Y-%m-%d") <= #{endDate}]]>
</if>
在 XML 中,多个连续的空格会被保留。XML 以 LF 存储换行。
DTD:
DTD(文档类型定义)主要用来描述xml文档的结构。用于验证自身或外部接收到的数据的正确性。DTD可以被XML文件本身直接包含或者通过外部引用进入XML。
以下是一个自身带有DTD的XML文档例子:
<?xml version="1.0"?>
<!DOCTYPE note [ //定义此文档是 note 类型的文档
<!ELEMENT note (to,from)> //定义根元素含有的子元素
<!ELEMENT to (#PCDATA)> //定义 to 元素为 "#PCDATA" 类型
<!ELEMENT from (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
</note>
或者DTD可以通过外部引入:
<!DOCTYPE note SYSTEM "note.dtd">
note.dtd:
<!ELEMENT note (to,from)> //定义根元素含有的子元素
<!ELEMENT to (#PCDATA)> //定义 to 元素为 "#PCDATA" 类型
<!ELEMENT from (#PCDATA)>
schema:
XML Schema 语言也称作 XSD(XML Schema Definition)。 它本身是一个XML文件,并且是DTD的继任者。
下面这个例子是一个名为 “note.xsd” 的 XML Schema 文件 :
<?xml version="1.0"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
//xmlns后面的值是要引用的xsd文件的命名空间,声明了xsd中用到的元素和数据类型来源,:xs还规定了该命名空间的前缀为xs。由于本文件是xsd文件,所以必定要引用http://www.w3.org/2001/XMLSchema这个xsd文件来定义元素。
targetNamespace="http://www.w3school.com.cn" //每个xsd都有一个自己取的命名空间名字
xmlns="http://www.w3school.com.cn"
//将本文件定义的元素也作为本文件的命名空间,其实一般在xsd文件中,也不会调用自己定义的元素,所以这行也可以不要
elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
note 元素是一个复合类型,因为它包含其他的子元素。其他元素 (to, from, heading, body) 是简易类型,因为它们没有包含其他元素。
note.xsd被其他文件引用:
<?xml version="1.0"?>
<note
xmlns="http://www.w3school.com.cn" //要求和引用的xsd文件的targetNamespace一致
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd"
//给出命名空间对应的xsd网络或本地位置,才能进行校验 >
<to>George</to>
<from>John</from>
</note>
xmlns指定了命名空间,xsi:schemaLocation指定了命名空间对应的模式文档(xsd文件或dtd文件)的位置。