什么是XML?

XML是可拓展标记语言,它和XHTML很像、但它和XHTML的目的性不一样,XHTML负责展示数据,而XML负责保存或交换传输数据。

而且XML可拓展,它没有固定的标签、它的标签可以自定义。

功能

  1. 数据存储。(可作为小型数据库,配置文件)
  2. 数据传输、交换。(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的节点有三种:元素,属性,文本。

实体引用

当我们编写含有特殊符号的文本时需要用到实体转移:

  • &lt:         <
  • &gt:        >
  • &amp:     &
  • &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种元素:

  • 仅仅包含元素的元素
  • 仅仅包含文本的元素
  • 包含文本和元素的混合元素
  • 空元素
  • 任意元素

我们以后会经常使用的符号:

  1. EMPTY              代表元素为空           <!ELEMENT 元素名 EMPTY>
  2. ANY                  代表任何内容           <!ELEMENT 元素名 ANY>
  3. (#PCDATA)       代表之包含文本     <!ELEMENT 元素名 (#PCDATA)>
  4. ()                     代表要包含的子元素  <!ELEMENT 元素名 (子元素)>
  5. ,                      代表子元素的顺序      <!ELEMENT 元素名 (子元素1,子元素2,…………)>          如果使用顺序符号,那么编写XML时子元素的顺序必须按照DTD的顺序编写
  6. |                      代表或                    <!ELEMENT 元素名 (子元素1|子元素2)>                    或的意思是 两个子元素必须二选一 且必须出现
  7. +                     代表至少出现一次      <!ELEMENT 元素名 (子元素1+)>                             子元素1至少出现一次
  8. *                     代表可0或任意次数     <!ELEMENT 元素名 (子元素1*)>                             子元素1可不出现,也可出现多次
  9. ?                     代表出现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>

最新文章

  1. reset 单个文件 回退
  2. MySQL命令大全:MySQL常用命令手册、MySQL命令行大全、查询工具
  3. Key/Value存储系统etcd的特性
  4. WCF初探-10:WCF客户端调用服务
  5. knockout 学习实例5 style
  6. kali Linux系列教程之BeFF安装与集成Metasploit
  7. DB2行转列、列转行等操作
  8. Thinkphp5 用ab压力测试工具测试高并发请求
  9. C++雾中风景4:多态引出的困惑,对象的拷贝?
  10. Java学习笔记-嵌套类
  11. Android的微信智能心跳方案
  12. Android初级教程获取手机系统联系人信息
  13. ab命令
  14. C# - Span 全面介绍:探索 .NET 新增的重要组成部分
  15. centos查看系统版本
  16. 《Redis 主从复制》
  17. day24(JAVAWEB上传与下载)
  18. zabbix】问题 Time zone for PHP is not set (configuration parameterdate.timezone)
  19. 内存与cpu的关系
  20. Apache 配置多个HTTPS站点

热门文章

  1. New MVC World
  2. atomikos分布式事务的几个坑
  3. NPOI读取Excel表格类
  4. Contoso 大学 - 8 – 实现继承
  5. 第三十六篇、webService
  6. c# 如何处理自定义消息
  7. 对JavaScript莫名的愤怒
  8. 打开shpfile,mdb,sde工作空间
  9. sphinx 占用大量内存
  10. 单纯形法C++实现