xml

来源:互联网 发布:中国少儿编程网 编辑:程序博客网 时间:2024/06/06 23:16

xml是可扩展标记语言。我们主要用他传输和储存数据。

一个xml必须由一个声明和一个文档根元素构成。

注意:声明中必须有版本号(目前就是1.0) 根元素可以是空元素 但只能有一个。

xml声明


声明有三个属性 version(必须),standalone(明XML文档是否独立不依赖于外部文档,默认值是yes,当使用外部XML DTD时需要将这个属性设为no)与encoding.encoding(编码格式)

DTD——文档类型定义(Document Type Definition)

由于XML可以自定义标签,那么自然各人编写的标签不一样,这样同步数据便成了问题,因为其它人不知道某个标签应该怎么用,表示什么意思.DTD就是为了解决此问题的!

DTD是一种保证XML文档格式正确的有效方法,可以比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。一个DTD文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体或符号规则。

DTD分为内部DTD与外部DTD,内部DTD包含在XML文档中,外部DTD则通过URL引用.一个DTD文件是以.dtd结尾的文本文件

在XML中引入DTD DOCTYPE 文档类型声明

内部DTD,可以将standalone设置成yes.

<?xml version="1.0" standalone="yes"?><!DOCTYPE root [<!ELEMENT root EMPTY>]>

外部DTD,需要将standalone设成no

<?xml version="1.0" standalone="no"?><!DOCTYPE root SYSTEM "http://www.test.org/test.dtd">

XML 文档构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素 , 元素即所说的自定义标签,它是 XML 以及 HTML 文档的主要构建模块。
  • 属性 , 属性可提供有关元素的额外信息。属性总是被置于某元素的开始标签中。属性总是以名称/值的形式成对出现的。
  • 实体 , 实体是用来定义普通文本的变量。实体引用是对实体的引用。如HTML文档中的&nbsp;即是一个实体引用当文档被 XML 解析器解析时,实体就会被展开。
  • PCDATA , PCDATA 的意思是被解析的字符数据(parsed character data)。可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。PDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。不过,被解析的字符数据不应当包含任何&、< 或者 > 字符;需要使用 &amp;、&lt; 以及 &gt; 实体来分别替换它们。
  • CDATA , CDATA 的意思是字符数据(character data)。CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

CDATA

PCDATA是指会被解析的字符串,这解析是指将其中的实体引用换成对应的实体内容.也就是说,一般的XML中的文本节点都是PCDATA,当这些文本中要包含一些XML特殊字符时,需要使用实体引用,当这些字符很少时,使用实体引用还不是很麻烦,而当特殊字符很多时,则需要使用CDATA,即不解析字符串.CDATA 区段开始于 "<![CDATA[",结束于 "]]>",CDATA段中可以包含除CDATA限定符之外的任何字符

元素声明

元素声明使用<!ELEMENT 元素名称 (元素内容)>或<!ELEMENT 元素名称 类别>的语法

<!ELEMENT root EMPTY> //EMPTY关键字表示元素是个空元素<!ELEMENT root ANY> //ANY关键字表示元素中可以出现任何内容,也可以为空//下面这个声明表示root中可以有文本,也可以是空<!ELEMENT root (#PCDATA)> //()表示一个分组,其中是放的允许在元素出现的内容,#PCDATA表示文本<!ELEMENT root (child)> //child是子元素的名称,这个声明表示root中必须且只能有一个child元素<!ELEMENT root (child1,child2)> //以逗号分隔,表示子元素依次出现<!ELEMENT root (child1|child2)> //竖线与"OR"的意思相近,表示root元素中只能出现child1或child2<!ELEMENT root (child?)> //root中child子元素可以出现一次,也可以不出现<!ELEMENT root (child+)> //root中child子元素至少出现一次<!ELEMENT root (child*)> //root中child子元素可以出现任意次数或不出现<!ELEMENT root (child,(a,b))> //()还可以嵌套,这里表示root元素中第一次子元素必须是child//紧接着是a或b<!ELEMENT root (child,(a,b)+)> //*,?,+这些量词可作用于分组,这里表示root元素中第一次子元素必须是child//紧接着是a或b出现一次或多次
<![CDATA[ABC-abc-ABC><&;&//这个不并被替换成&吧]]>

属性声明

属性声明使用<!ATTLIST 元素名称 属性名称 属性类型 默认值>的语法.示例如下:

<!ATTLIST input type CDATA "text">

上面的属性声明表示:元素input的type属性值是文本,默认值是text;

以下是属性类型表

类型描述CDATA值为字符数据 (character data)(en1|en2|..)此值是枚举列表中的一个值ID值为唯一的 idIDREF值为另外一个元素的 idIDREFS值为其他 id 的列表NMTOKEN值为合法的 XML 名称NMTOKENS值为合法的 XML 名称的列表ENTITY值是一个实体ENTITIES值是一个实体列表NOTATION此值是符号的名称xml:值是一个预定义的 XML 值

默认值参数可以使用下列值

值解释值属性的默认值.该属性可以出现,也可以不出现,当没有明确指定该属性时,属性值使用默认值#REQUIRED属性值是必需的#IMPLIED属性不是必需的,可以出现,可以不出现#FIXED value属性值是固定的.属性可有可无,但有的时候,其值必须是value
<!ATTLIST img src CDATA #REQUIRED> //img元素的src属性是必须的,值为字符串<!ATTLIST script type CDATA "text/javascript"> //script元素的type属性默认值是text/javascript<!ATTLIST div id ID #IMPLIED> //div元素的id属性是唯一的ID标识,可有可无<!ATTLIST input type(text|radio|checkbox) "text"> //input元素的type属性是三个值中的一个,默认值是text<!ATTLIST label for IDREF #IMPLIED> //label元素的for属性是页面中另一个元素的ID

实体声明

一般实体

实体是用于定义用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用是对实体的引用。实体可在内部或外部进行声明。

一个内部实体是以<!ENTITY 实体名称 "实体的值">的形式声明的,一个外部私有实体是以<!ENTITY 实体名称 SYSTEM "URI/URL">格式声明 ,一个外部公共实体是以<!ENTITY 实体名称 PUBLIC "公共实体名称" "URI/URL"> ,其中公共实体名称和DOCTYPE中的公共DTD名称格式是一样的. 一个实体引用是&实体名称;格式

//实体定义<!ENTITY abc "ABCabcABC"> //内部实体<!ENTITY abc SYSTEM "abc.ent"> //外部私有实体<!ENTITY test PUBLIC "-//AjaxLife//ENTITIES TEST 1 for XML//EN" "test.ent"> //外部公共实体//实体引用<abc>&abc;</abc>
参数实体

参数实体是只在DTD中使用的实体(并且参数实体只能在外部DTD中声明),它的声明语法与一般实体不同处在于其要在实体名称前加个百分号,而引用时则使用%实体名称;的形式

<!ENTITY % abc "root"><!ELEMENT %abc; (child)>//这句将声明元素root,具有一个子元素child

XML 命名空间

XML 命名空间可提供避免元素命名冲突的方法。由于 XML 中的元素名是预定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。命名空间其实就是给这些标签名加个前缀!

<root><svg:template /><xsl:template /></root>

现在,root下仍然是两个template元素,它们的节点名称仍然是template,但是它们的意义不一样了,因为它们使用了不同的前缀!但是XML命名空间前缀需要声明才可以使用,如果不声明,则被视为元素名称的一部分!XML 命名空间属性被放置于某个元素的开始标签之中,并使用以下的语法:xmlns:namespace-prefix="namespaceURI" .当一个命名空间被定义在某个元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。注意,用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向某个实存的网页,这个网页包含着有关命名空间的信息。

<root xmlns:svg="http://www.svg.org" xmlns:xsl="http://www.xsl.org"><svg:template /><xsl:template /></root>

这样,为了区分那些名称相同而含义不同的元素,必须在每个元素名前面加前缀.其实还可以在父级元素上声明默认命名空间,让所有没有前缀子元素的默认使用此命名空间.HTML的命名空间便是一个例子.

<html xmlns="http://www.w3.org/1999/xhtml"></html>
对于使用命名空间的XML文档,其DTD中对元素的声明也应该包含命名空间前缀(即应与文档中所书写的一致).另外,命名空间不但作用于元素,还作用于属性

原创粉丝点击