起源之路——理解和看懂XML

起源之路——理解和看懂XML

XML简介

什么是XML

  • XML是一种基于文本的标记语言,类似于HTML;
  • XML是可扩展的标记语言,你可以随心所欲的使用任何XML标签;
  • XML用于表示数据,而不是显示数据,它将一块数据定义一个识别标记标签(例如:用<from>XXX</from>,来表示数据来自于XXX)
  • XML标签没有被预定义,需要用户自行定义标签
  • XML具有自我描述性(即可以直接通过XML内容,了解其要传达的信息)

XML的特性

  • 不作为性
    XML是不作为的;它本身不会做任何事情,仅被用户用来结构化存储以及传输。
    例如:
    <book>  
        <title>《起源之路》</title>  
        <price>¥1.25</price>  
    </book>
    
    上面的XML就具有自我描述性,可以看出这是一本书,拥有标题和价格属性。但是它没有做任何事情,仅仅是用一种特殊的写法包装了一些纯粹的信息。只有编写响应的程序或软件才能传送、接收和显示这个文档。
  • 无格式文本
    XML仅仅只是纯文本,从标准的文本编辑器到可视化开发环境,你可以使用任何工具来创建和编辑XML。
  • 数据标识
    XML可以描述数据类型,但不确定如何显示数据(这种事一般由程序或软件决定在读入XML之后如何显示或处理数据)。
  • 可样式
    当显示十分重要时,XSL样式表标准可以告诉你如何描绘数据;
  • 易处理
  • 层次结构

XML与HTML的区别

  • HTML有大量的预定义标签属性,XML则没有。XML由标签用户完全定制。
  • 某种意义上来说HTML是XML的子集,一个HTML文档实际上也是一种特殊XML文档(尽管如此XML语法相对于HTML而言严苛许多,因为HTML容错机制,允许用户省略部分结束标签或一些其他机制,而这在XML中是绝对不允许的)
  • HTML是为了显示数据而设计的,它关注的是如何呈现数据,XML则是为了传输和存储数据,它关注的是数据的内容

如何使用XML

  • 通常的数据处理
    在C/S架构中,客户端和服务端来回传送XML数据。
  • 文档驱动式程序设计
    用XML来构造描述应用页面显示方式的文档,它不仅用于显示,而是将接口组件和业务逻辑组件联结在一起从而动态的创建应有程序。
  • 存档
    保存信息的基本机制称为存档。在理想情况下,无论是数据还是程序组件,都可以以一种可重用的格式写入到一个输出流中,之后以一种特定方式保存。在使用时通过读取保存的信息,稍加编译,就可以重新组合成原有的应用程序或数据。
  • 绑定
    利用DTD或者某种架构标准定义XML数据的结构之后,大部分的处理都有了定义。通过规范数据结构或格式,可是很轻松的生成对应的处理代码。这一过程称为绑定(即通过处理定义数据元素的规范说明,创建识别和处理不同数据元素的类)。

编写XML

XML语法

  • 所有元素都必须有关闭标签。

  • 所有标签对大小写敏感 <book></book><Book></Book>是两种不同标签,尽管他们看起来表述的意义一致。同时开始标签与结束标签的大小写必须一致。

  • 标签必须正确的嵌套(用过HTML的都懂)。

  • 文档必须有一个根元素是其他元素的父元素。

  • 属性值必须加英文半角双引号(")。

  • 转义字符(实体引用)
    一些通用字符需要转义,例如("<"),它会被识别为新元素的开始。因此编写时需要将通用字符用预定义字符(实体引用)来代替;

    预定义字符通用字符说明
    &lt;<小于
    &gt;>大于
    &amp;&和号
    &apos;'单引号
    &quot;"双引号
  • 注释(不解释)。

  • XMl中空格不会合并,敲了几个就几个。

文档类型定义(DTD)

什么是DTD

DTD就是使用一系列的合法元素来定义文档的结构,DTD告诉验证解析器和非验证解析器希望文本出现在什么地方,解析器根据什么原则判断空白是否可以忽略,同时告诉验证解析器哪些标签有效,以及在什么布局下有效。

DTD语法

<!ELEMENT slideshow (slide+)> DTD标签以<!开始,紧跟着是标签名(ELEMENT),标签名之后是要定义的元素的名字(slideshow),括号内是允许出现的子标签(slide),括号内可以出现多个元素,表明元素的有效内容。“+”号是限定符,其规则与正则基本一致,表示可以出现一个或多个子标签。
DTD的元素限定符:

限定符名字意义
问号可选(零个或一个)
*星号零个或多个
+加好一个或多个

例:

<!-- 声明一个空元素 -->
<!ELEMENT br EMPTY>
<!-- 声明带有任何内容的元素 -->
<!ELEMENT note ANY>
<!-- 表示幻灯片由一个title和零个或多个item构成 -->
<!ELEMENT slide (title,item*)>
<!-- 表示标题由完整的解析的字符数据(PCDATA)组成 ,PCDATA 是会被解析器解析的文本。
这些文本将被解析器检查实体以及标记。-->
<!ELEMENT title (#PCDATA)>
<!-- or 条件,表示由PCDATA或item出现,括号外的*号表示其可能出现0次或多次 -->
<!ELEMENT item (#PCDATA|item)*>

DTD的引用

大多数情况下,DTD定义与XML文档不在同一文档中,因此,我们必须在XML中引用DTD;
例如:<!DOCTYPE slideshow SYSTEM "slideshow.dtd">;与DTD声明相似,以<!开始,标签名DOCTYPE说明该文档是由元素slideshow和它内部的所有内容组成,该标签将slideshow定义为文档的根元素。SYSTEM标识符指定DTD文件的位置,当不以http://或file:/这类前缀开头时,DTD文件的路径是相对于当前XML的路径位置的。

DTD属性定义
<!ELEMENT slideshow (slide+)>
<!-- 定义slideshow元素的属性 -->
<!ATTLIST slideshow 
    title CDATA #REQUIRED
    date CDATA #IMPLIED
    author CDATA "unknown"
>

ATTLIST 用户定义属性,slideshow后面指定了要定义的属性。每行一个属性,(这种格式化写法可以很好的增强可读性)每个属性有三个空格隔开的值定义,不允许使用逗号或其他分隔符,行中第一个元素是属性名称,第二个元素是属性类型:CDATA——不可解析的数据(文本,所有特殊或不特殊字符都被视为文本),详见属性类型表;第三个属性是属性的默认值,并说明是否需要属性,详见属性规范参数。

属性类型表:

属性类型意义
(value1|value2|…)or条件组合的属性可选列表
CDATA“未解析的字符数据”(文本字符串)
ID一个没有与其他ID属性共享的名字
IDREF对文档其他定义的ID的引用
IDREFS包含一个或多个ID引用的列表
ENTITYDTD定义中实体的名字
ENTITYS空格间隔的实体的列表
NMTOKEN由字母、数字、连字符、下划线和冒号构成的有效XML名称
NMTOKENS用空格间隔的名称列表
NMTATIONDTD指定符号表示法的名称

属性规范参数表:

规范意义
#REQUIRED必须指定的属性
#IMPLIED不需要指定的属性,如果没有指定应用程序将使用提供的默认值
“defaultValue”如果文档中没有指定值,就使用该值
#FIXED “fixed Value”必定要使用的值,如果文档属性中指定了值。则必须与该值相同
实体的定义
<!-- 定义实体 -->
<!DOCTYPE slideshow SYSTEM "slideshow.dtd" [
    <!ENTITY product "WonderWidget">
    <!ENTITY products "WonderWidgets">
    <!-- 引用外部实体,寻址规则与DTD文件引入的寻址规则一致 -->
    <!ENTITY  copyright SYSTEM "copyright.xml">
    <!-- 引用外部实体,访问Sevlet生成当前日期 -->
    <!ENTITY  currentDate SYSTEM "http://www.example.com/servlet/date?fmt=yyyy-MM-dd">
]>
<!-- 使用实体 -->
<slideshow title="&product;Slide Show">
    <slide type="all">
        <title>Wake up to &products;!</title>
    </slide>
    <slide type="all">
        <item>&copyright;</item>
    </slide>
    
</slideshow>

使用命名空间(名称空间)

在DTD中含有title标签和XML同时也需要使用title时,必须用某种方法来解决两个同名元素之间的冲突,因此我们使用命名空间(名称空间,以下统称命名空间)。命名空间规范是为让作者告诉解析器在解析给定元素时使用哪个DTD或架构。

命名空间的定义

在DTD中,通过添加xmlns(“xml name space”)属性来定义该元素的命名空间。
例如:

<!ELEMENT title ANY >
<!-- 
定义命名空间,将xmlns属性定义为FIXED避免了文档为xmlns属性指定任何不匹配的值;
该DTD中定义的元素时唯一的;当文档为标签指定xmlns属性时,文档具有匹配属性的元素定义
 -->
<!ATTLIST title 
    xmlns CDATA #FIXED "http://www.example.com/slideshow"
>
<!-- 引用命名空间 -->
<title xmlns="http://www.example.com/slideshow">
    Overview
</title>
<!-- 定义命名空间的空间前缀,在多次引用命名空间时可以使用空间前缀来简化书写 -->
<SL:slideshow xmlns:SL='http://www.example.com/slideshow' >
    <slide type="all">
        <SL:title>&copyright;</SL:title>
    </slide>
</SL:slideshow>


自己使用整理收集,如有侵权 请联系删除!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值