XML
XML语法
基本规则
(1).XML是区分大小写的;
(2).所有元素的起始和结束标注必须成对出现,且要正确嵌套;
(3).如果使XML说明,则它必须是XML文档的第一行:<?xml version=”1.0”?>,一般还要在里面指定编码集,否则默认使用ISO-8859-1编码,该编码是不支持中文的。(文件保存的编码集必须和文件查看的编码集一致,否则会出现乱码)
(4).元素属性必须用引号引起来,单、双引号都可以,但必须成对出现。如:
<basic attr=”1.0”>
<basic attr=’1.0’>
(5).XML命名规则:
①.XML名以下划线或字母开始;
②.XML名可包含字母、数字、句点、下划线和冒号;
③.XML名不能包含空格;
④.XML名不能以数字开始,但可包含数字;
⑤.XML名区分大小写。
(6).保留标记字符,如果要在XML中显示<或&之类的标记,就要使用字符的实体形式,XML中有五种预先定义了的实体:
<: 表示<字符
>: 表示>字符
&: 表示&字符
&apos: 表示’字符
": 表示”字符
我们也可用ENTITY自定义实体:
<!ENTITY linux “linux is a very good system”>
这样我们可用&linux来调用。
(7).XML文档内容中的空格是有意义的,在转换后会保留。(所以要避免全角符号的出现特别是全角空格,该错误很难排查)
(8).元素以<开始并以/>结束,如<br/>。
元素(ELEMENT)
元素其实就是标记,或者也可以将元素视为标记名称,并没有很明确的定义,而只是一个形容词而已。元素可以说XML文件里最重要的构成单元。有三种元素使用方法:⑴简单内容,文本或其它数据出现在开始和结束标记之间。开始标记与结束标记有相同名字,但结束标记明要以一个斜杠开始。下面的元素包括一个开始标记、内容和一个结束标记
<author>Stephen Hawking</author>.
⑵把元素用作其它元素的容器,元素包含其他元素,呈现出一种分层或树形数据结构。以下的book元素包含了author和title元素
<book>
<author>Stephen Hawking</author>
<title>A brief history of time</title>
</book>
⑶空元素用作属性容器,当元素只包含属性而无内容时,有一种不需使用开始和结束标记的元素简写方式。空元素的书写可用标记名后跟着一个斜杠来表示
<book/>
他表示了:<book></book>空元素常用来包含属性数据。<book title=”A brief history of time” author=”Stephen Hawking”/>
元素命名规则⑴名字可以包含字母、数字和其他字符。⑵名字不能以数字或标点开始。⑶名字不能用字符串“XML”开始,不管是小写形式还是大写形式。⑷名字不能包含空格,不能使用冒号。
属性
属性提供了有关元素的附加信息。再HTML中,当加载HTML文档时,属性用来规定图像文件的名字:<img src=”inde01.gif”>属性常用来表明信息,它不是元素中被描述数据的一部分。属性也常用来描述有关数据本身的信息。以下的XML中属性use告诉程序处理此文件不需要的数据
<file use=”optional”>index01.gif</file>
在XML中,属性值必须用单引号或双引号包围。
一般共识:如果信息看起来像数据就使用元素;而在描述有关数据的信息时就使用属性。不使用属性来存储数据的原因包括:⑴属性不能包含多个值,而元素能包含多个子元素。⑵属性不容易扩展以适应将来的变化。⑶与元素相比,用程序更难以操作属性。⑷不容易检查属性值是否违反文档类型定义(DTD)。
实体
实体用来替代XML文档中的字符串.例如:短语”XML and the Data Revolution”当文档中重复出现,就可在DTD中定义一个快捷实体声明。
<!ENTITY xdr”XML and the Data Revolution”>
这样,当要是用整个短语时,就可使用&xdr;而他在XML文档中会被替换。使用实体就可以避免拼写错误以及反复输入同一件事的繁琐。同时还有预定义实体和参数实体之分
XML文档的组成
一个完整地XML应该具备以下规则:
1.文档的开始必须是XML声明。
2.含有数据的元素必须有起始标记和结束标记。
3.不含数据并且仅使用一个标记的元素必须以/>结束。
4.文档只能包含一个能够包含全部其他元素的元素。
5.元素只能嵌套不能重叠。
6.属性值必须加引号。
7.字符<和&只能用于起始标记和实体引用。
8.出现的实体引用只有&、<、>、'和"。
XML声明:
1.version,定义XML规范的版本号,到现在为止,只有一个版本号1.0 。
<?xml version="1.0" standalone="yes"?>
他的出现是文档最开头的部分,因为XML处理器会读取文件最先的几个字节并将它与字符串<?XML的不同编码作比较来确定正在使用的字符串集。除去看不见的字节顺序记号,在它之前不能有任何东西,包括空格。①在非空标记中使用起始和结束标记:如果忘了结束HTML的标记,Web浏览器并不严格追究。例如,如果文档包含一个<B>标记却没有相应的</B>标记,在<B>标记之后的全部文档将变为粗体。但文档仍然能显示。XML不会如此宽松,每个起始标记必须以相应的结束标记结束。如果一个文档未能结束一个标记,浏览器或移交器将报告一个错误信息,并且不会以任何形式显示任何文档的内容。②用"/>"结束空标记:不包含数据的标记,例如HTML的<BR>、<HR>和<IMG>,不需要结束标记。但是XML空标记必须由/>结束,而不是>。例如<BR>、<HR>和<IMG>的XML等价物是<BR/>、<HR/>和<IMG/>。
当前的Web浏览器处理这种标记的方法不一致。但是如果想保持向后的兼容性,可以使用结束标记来代替,而且不能在其间包含任何文本。例如:
<BR></BR> 、 <HR></HR>、 <IMG></IMG>即使这样,Netscape处理<BR></BR>也有困难(它把这两个标记解释为行间距,而不是前面所讲的)。因此,在HTML中包含结构完整的空标记也并非总是可行的。
2.encoding,指定文档的编码系统。
3.standalone,定义文档是独立的还是需要装入其他元素才能正确分析。如果XML文档没有外部实体或DTD,则可以设置为no,否则设置为yes。可用该值提高性能:如果为no,则可提高处理速度;如果设置为yes,则首先要分析文档,确定需要其他哪些文件,然后才能完全分析文档。
4.根元素,每篇XML文档都需要有且只能有一个根元素。由元素是文档的第一个元素,包含其它所有元素。下例的portal就是根元素,如:
<portal>
<name>jims</name>
<email></email>
…
</portal>
属性,每个元素都可以设置一个或多个属性,如:
<portal>
<name id=’1’,sex=”male”>Jims</name>
</portal>
元素和属性都可以表示信息,属性信息表现能力有限,它只能表示字符串。所以当需灵活表示信息时应该使用元素。一般把信息主体放到元素中,属性只放一些注释或额外的信息。
CDATA CDATA的格式:
〈![CDATA[ |
它用<![CDATA[和]]>表示,它们之间的数据作为原始字符显示,唯一不能出现的标志是]]>。
注释,注释是很重要,不论是在编写程序和文档时,所以XML也提供了注释功能,以<!--开头,以-->结尾的一对区间为注释。在以-->结束之前,不能出现“--”号,“---”更不允许。
处理指令,处理指令以<?开头以?>结尾。处理指令是标记而不是元素。与注释一样,处理指令可出现在XML文档的标签外的任何位置,包括根元素之前或之后。最常见的处理指令是,xml-stylesheet样式表指令,它会告诉浏览器在显示文档时应用什么样式表。如:
<?xml-stylesheet href=”sample.css” type=”text/css”?>
<portal>
<name>…</name>
…
</portal>
命名空间
命名冲突问题是XML文档中引入多DTD的老大难问题,那么,命名空间标准又是如何解决这一问题的呢?一个直接的想法是保证所引用到的DTD没有重名的元素。可是,你所引用的DTD可能来自世界上各个地方,由不同的人制定,要求这成千上万的DTD没有重名现象似乎有些异想天开,且想想你身边重名的人还有多少呢!再有一个想法就是要求所引用到的DTD改名字,把“联系人列表”中的元素“姓名”改为“联系人姓名”,“电话”改为“联系人电话”;相应地,“企业经理”中的“姓名”改为“经理姓名”,“电话”改为“经理电话”。但是,如果出现了大量重名元素,这个修改的工作量就很大了,如此麻烦,多DTD的优势消失殆尽,还不如自己重新定义一个呢。命名空间标准提供了一个很聪明的方法,就是所谓前缀标识法,即在元素名和属性名前面增加一个标识,以唯一区分当前元素或属性来自哪一个DTD。
命名空间声明有两种方式:直接定义方式和缺省定义方式:
直接定义 |
xmlns:<命名空间前缀> = <命名空间名> |
缺省定义 |
xmlns = <命名空间名> |
直接定义方式
命名空间声明的属性名部分由两部分组成,即保留属性名前缀"xmlns:"和命名空间前缀,且命名空间前缀是一个合法的XML名称。例如,"xmlns: 联系人"、"xmlns: 企业经理"都是合法的命名空间声明的属性名。
命名空间声明的属性值部分是一个URI引用,其功能是区分不同的命名空间,因此,这个URI引用被称为“命名空间名”,它应该具有唯一性和持久性。
缺省定义方式
在缺省方式下,命名空间声明的属性名部分仅有保留属性名xmlns,属性值部分与直接定义方式相同。例如:
<联系人:联系人列表 xmlns ="http://xml.net.cn/联系人列表.dtd" xmlns:企业经理 ="http://xml.net.cn/企业经理.dtd"> |
DTD的基本要素
DTD的全称是“Document Type Definition“(文件类型定义)。他是用来规范XML文件的格式,它必须出现在文件头(Prolog)中,以便XML校验器在一开始便可以得到该份XML文件的格式定义。
XML分为两类:有效XML文档和简化格式XML文档。有效是指有一个DTD参考文件的XML文档 ,一个有效的XML文档必须是简化格式的XML文档,跟随着这个文档的DTD文件的有效性,促进了XML执行程序的运行以及文档在兼容XML浏览器的显示。
要使用DTD进行有效性检验,就要使用文档类型定义声明指定DTD。例如:<?xml version="1.0" standalone="no"?>
<!DOCTYPE portal SYSTEM "http://www.w3c.com/dtd/portal.dtd">
<portal>
<name>Jims</name>
<email>Jims@163.com</email>
<email>Jims@21cn.com</email>
</portal>
文档类型声明位于XML声明之后,根元素之前。如果DTD文档位于本机,可用路径名直接指出DTD文档的位置。如果DTD位于XML文档外,则叫外部DTD子集。我们可以结合内外DTD,共同组成一个DTD来为XML文档作验证。
具体地说,DTD是一个或是一些用XML书写的文件。它包含了对一种文件的正式定义。它定义了文件中的元素能用什么名字,能放在什么位置,应该怎样组合。在这里举一个简单的例子。比如说想要文件可以描述一组<List>,其中每个<List>由可以包含若干个<Item>。那么DTD中应该有以下语句:
<!ELEMENT List (Item)+>
<!ELEMENT Item (#PCDATA)>
这样一个框架定义了一个表(list),它可以包含若干个项(items)。每一个项只能包括文本的内容。当处理器处理XML文件时将自动检查DTD,以此确定文件中元素从哪而来,以及它们之间是什么关系。上面的框架允许生成下面的一个表:
<List><Item>Chocolate</Item><Item>Music</Item><Item>Surfing</Item></List>
而这样一个表在屏幕上是怎样一个表象,取决于样式表(Stylesheet)。在HTML中要在文件中指定应是怎样的形式。使用DTD表明你能够确定一类文章的结构和格式。
文档类型声明中的每一项都是元素声明,定义了每个元素的约束。元素声明的格式为:
<!ELEMENT element_name (content_model)>
内容包括:1. #PCDATA,规定元素只包含已析的字符数据。
2. 子元素,可指明元素的子元素。也可用逗号为分隔符,指明多个子元素。并且子元素出现的次序必须按定义时的顺序。
3. 子元素的个数,我们可通过正则表达式来规定子元素的个数。①?,允许零个或一个该元素 ②*,允许零个或多个该元素 ③+,允许一个或多个该元素
4. 可选项(|),选项是一个参数列表,每个参数间用“|”分隔,代表能且只能选一个子元素。
5. 小括号,可用小括号把选项括起来,以表达更丰富的意思,如我们想表示choice元素必须包含一个good子元素,并且必须包含ok子元素或bad子元素的一个。
6. 混合内容,在一些文档中,一个元素可能既包含子元素,也包含字符串,这些内容叫混合内容。
7. 空元素,某些元素不用包含任何内容,称之为空元素。写成以/>结束的独立标签。
8. ANY,允许元素内包含任意内容。该选项在dtd测试时很有用,在生产系统中尽量不要使用。
一个有效的XML文档,必须对元素的属性进行声明。使用ATTLIST声明来完成,一个ATTLIST可以为一个元素类型声明多个属性。
有效文档中使用的每个元素都必须在文档的DTD中用元素声明进行声明。element_name可是任何合法的XML名称,content_model(内容模型)指定元素可以或必须包含的子元素以及子元素的顺序。