什么是XML?
XML是可拓展标记语言,它和XHTML很像、但它和XHTML的目的性不一样,XHTML负责展示数据,而XML负责保存或交换传输数据。
而且XML可拓展,它没有固定的标签、它的标签可以自定义。
功能
- 数据存储。(可作为小型数据库,配置文件)
- 数据传输、交换。(ajax,web服务:天气查询,电话号码归属地查询等)
结构
XML是树形结构,必须拥有一个根节点:
<?xml version="1.0" encoding="UTF-8"?> <books> <book number="0593"> <name>1984</name> <category>文学</category> </book> <book number="1578"> <name>史记</name> <category>历史</category> </book> <book number="5493"> <name>西西弗神话</name> <category>哲学</category> </book> </books>
注:根节点必须且只有一个,XML的节点有三种:元素,属性,文本。
实体引用
当我们编写含有特殊符号的文本时需要用到实体转移:
- <: <
- >: >
- &: &
- &apos: '
- quot: "
当文本含有过多的特殊符号时 可以使用CDATA处理:
<?xml version="1.0" encoding="UTF-8"?> <root> <some_string> <![CDATA[ slie'se'f'd"sa"<>fe &&&&& ]]> </some_string> </root>
DTD
DTD是用来规范XML的,XML是可拓展的标记语言,元素可以随意编写 所以我们需要一种机制来约束或者说规范XML文档,特别是在传输数据时。
验证网站:http://validator.w3.org
元素定义
<!ELEMENT 元素名 元素内容模型>
我们需要处理5种元素:
- 仅仅包含元素的元素
- 仅仅包含文本的元素
- 包含文本和元素的混合元素
- 空元素
- 任意元素
我们以后会经常使用的符号:
- EMPTY 代表元素为空 <!ELEMENT 元素名 EMPTY>
- ANY 代表任何内容 <!ELEMENT 元素名 ANY>
- (#PCDATA) 代表之包含文本 <!ELEMENT 元素名 (#PCDATA)>
- () 代表要包含的子元素 <!ELEMENT 元素名 (子元素)>
- , 代表子元素的顺序 <!ELEMENT 元素名 (子元素1,子元素2,…………)> 如果使用顺序符号,那么编写XML时子元素的顺序必须按照DTD的顺序编写
- | 代表或 <!ELEMENT 元素名 (子元素1|子元素2)> 或的意思是 两个子元素必须二选一 且必须出现
- + 代表至少出现一次 <!ELEMENT 元素名 (子元素1+)> 子元素1至少出现一次
- * 代表可0或任意次数 <!ELEMENT 元素名 (子元素1*)> 子元素1可不出现,也可出现多次
- ? 代表出现0或1次 <!ELEMENT 元素名 (子元素1?)> 子元素1可不出现,或只能出现一次
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books[ <!ELEMENT books (book+)> <!ELEMENT book (name,category)> <!ELEMENT name (#PCDATA)> <!ELEMENT category (#PCDATA)> ]> <books> <book> <name>1984</name> <category>文学</category> </book> <book> <name>史记</name> <category>历史</category> </book> <book> <name>西西弗神话</name> <category>哲学</category> </book> </books>
包含混合元素:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books[ <!ELEMENT books (book+)> <!ELEMENT book (name,category)> <!ELEMENT name (#PCDATA)> <!ELEMENT category (#PCDATA|some_element)*> <!ELEMENT some_element (#PCDATA)> ]> <books> <book> <name>1984</name> <category>文<some_element>sliejfj</some_element>学</category> </book> <book> <name>史记</name> <category>历史</category> </book> <book> <name>西西弗神话</name> <category>哲学</category> </book> </books>
属性定义
格式:<!ATTLIST 元素名 属性名 属性值类型 取值方式>
属性值类型:
- CDATA:字符类型。
- (en1,en2....):枚举中的一个。
- ID:值是唯一的ID,只允许出现一次。
- IDREF:值是另一个元素的ID。
- IDREFS:值为其他ID列表。
- NMTOKEN:值为合法的XML名称。
- NMTOKENS:值为合法的XML名称列表。
- ENTITY:值为一个实体。
- ENTITIES:实体列表。
- NOTATION:符号的名称。
- xml:值是预定义的xml值。
取值方式:
- REQUIRED:属性值是必须的。
- IMPLIED:属性值不是必须的。
- FIXED value:属性值是固定的,如果没有声明 则默认是这个值,如果声明了 那只能写这个值。
例子1:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books[ <!ELEMENT books (book+)> <!ELEMENT book (name)> <!ELEMENT name (#PCDATA)> <!ATTLIST book category CDATA #REQUIRED> <!ATTLIST name order CDATA #IMPLIED> ]> <books> <book category='工具书'> <name order='0'>PHP经典实例</name> </book> <book category='历史'> <name>三国志</name> </book> </books>
例子2:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books[ <!ELEMENT books (book)*> <!ELEMENT book (name)> <!ELEMENT name (#PCDATA)> <!ATTLIST name lang (en|zh) #IMPLIED> ]> <books> <book> <name lang='en'>ThinkPHP</name> </book> </books>
例子3:默认值写法,如果没有声明用默认值,如果声明了 则覆盖默认值。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books[ <!ELEMENT books (book)*> <!ELEMENT book (name)> <!ELEMENT name (#PCDATA)> <!ATTLIST name lang (en|zh) 'zh'> ]> <books> <book> <name lang='en'>ThinkPHP</name> </book> </books>
例子4:一个元素含有多个属性
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books[ <!ELEMENT books (book)*> <!ELEMENT book (name)> <!ELEMENT name (#PCDATA)> <!ATTLIST name lang (en|zh) #REQUIRED id ID #REQUIRED> ]> <books> <book> <name lang='en' id='q1'>ThinkPHP</name> </book> </books>