第一部分:文档声明
文档声明必须在XML文档的第一行,按照严格的XML语法,声明语句前面不应该有空行。
-
最简单的声明语句,version属性表示XML版本, 是必须的。
<?xml version="1.0" ?>
-
用encoding属性说明文档字符编码, 不是必须的。当没有声明时,解析器默认以utf-8,或者utf-16对其解读。
<?xml version="1.0" encoding="GB2312" ?>
- 用standalone属性说明文档是否独立,属性值可以是yes或者no,不是必须的
<?xml version="1.0" encoding="GB2312" standalone="yes" ?>
- 关于encoding属性的设置:写包含中文内容的XML时,如若编码声明不当,会导致解析器无法正常解析。注意两点:(保证源文件编码与声明语句声明的编码要一致,encoding属性告诉解析器以特定的编码解析源文件)
- 编辑的源文件应该保存为utf-8,GBK,GB2312其中一个编码。
- 在XML声明中encoding属性值要和第一点中选择的编码相同。如果保存为utf-8,可以不用在XML声明中声明,解析器会自动解析。如果用GB2312,则在encoding属性的值一定要是GB2312。
第二部分:元素定义
- 示例
<?xml version="1.0" encoding="GB2312" ?> <咸蛋超人> <超人1> <name> 烤地瓜 </name> </超人1> <超人2> <name> 笨蛋 </name> <id/> <address></address> </超人2> </咸蛋超人>
- 一个XML元素有一个开始标记和一个对应的结束标记来定义,标记中间是内容
<咸蛋超人>内容</咸蛋超人>
- 一个元素可以嵌套多个子元素
<超人1> <name> 烤地瓜 </name> </超人1>
- 可以使用空元素,有两种表示方式,示例第12和第13行分别以两种方式声明了两个空元素。空元素的一个应用就是通过属性值传递信息。(当然,非空元素也同样可以定义属性)
<!-- 这个空标签有属性src --> <image src="abc.jpg" />
- 严格的XML语法规定必须有且只有一个根元素,即示例中的<咸蛋超人></咸蛋超人>
- 元素标记名称规范:可以包含字母,数字以及其它字符
- 区分大小写,<p/>和<P/>是不同标记
- 不能以数字或者下划线“_”开头
- 不能以字符组合xml,或者Xml,xMl,xmL,XMl,xML,XML(即xml的大小写任何组合)等开头。
- 不能包含空格,<书 名></书 名>是错误的。
- 不能包含冒号“:”
- 推荐的元素标记命名建议:
- 命名尽量简短,减少XML大小
- 慎重使用非英文字符,某些应用程序可能不支持非英文字符。
- 不要使用点号“.”,点号在很多程序语言中表示引用等特殊含义。
- 不要使用减号“-”,以下划线“_”代替,避免与表达式中的减号运算符冲突。
- 属性定义:
- 一个标签可以有多个属性。
<售价 单位="元" >58</售价>
- 属性可以被改写成以子元素的形式来描述信息,效果相同。
<售价> <单位>元</单位> <价格>58</价格> </售价>
- 属性值一定要用双引号或者单引号括起来。
- 属性命名规则与标签命名规则一样。
第三部分:注释
- 示例
<?xml version="1.0" encoding="UTF-8" ?> <!-- 注释 --> <书架> <书> <书名>好书</书名> <作者>某人</作者> </书> </书架>
- 注释不能出现在XML声明之前。
- 一对注释符号之间不能包含另外一对注释符号,一下为错误的示例
<!-- 注释 ....... ....... <!-- 局部注释 --> ....... -->
- 注释中出现中文无法解析问题: 解析器虽然会忽略注释内容,但是解析器对内容执行了读取动作,如若编码不当,就会出现无法解析问题。由于解析器读取注释内容与读取标签等其它内容后的处理方式不一样(解析器读取注释内容后忽略之),导致对这个问题的处理方式与之前讲XML中标签出现中文无法解析问题处理方式稍有区别。
1.解决方案一: 如果注释中出现中文字符,而且XML文件声明中没有指定encoding属性,那么需要将encoding属性设置为GB2312即可,无需考虑源文件是否保存为GB2312编码格式。(这个与前面所讲的标签出现中文无法解析的处理方式不同) 2.解决方案二: 将XML源文件保存为utf-8编码格式即可,无需修改XML声明中的encoding属性值。这是因为解析器默认会以utf-8编码读取内容。
我们可以向Tomcat容器/conf/server.xml文件中添加一行中文注释<!--中文注释-->来验证,添加注释后无法启动Tomcat,通过第一个方法后就可以正常启动了。
第四部分:空格和换行处理
- XML文件中的标签以外的所有空格和换行,XML解析程序会如实交给下游程序处理。如以下两个代码含义是不一样的。因此使用换行等方式来让源文件增强可读性的习惯要被迫改变。
<address>WorshintonDC.USA</address> <!--这行标签括起来的值仅仅是WorshintonDC.USA这个字符串-->
<address> WorshintonDC.USA </address> <!--包含一个回车符,一个制表符,字符串WorshintonDC.USA,一个回车符-->
第五部分:CDATA区
- 示例
<script> <![CDATA[ for(var i = 0; i < 10; i ++) { } ]]> </script>
- CDATA区(charater data的缩写)内的内容XML解析器不会对其进行解析,它会原封不动地交给下游程序处理。
- CDATA区内不能出现字符串“]]>”例如以下错误示例
<javaCode> <![CDATA[ if(array[num[i]]>10) { } ]]> </javaCode>
解决方法1.在“]]”与“>”之间插入一个空格;解决方法2:将字符串“]]>”分开放到两个CDATA区中
第六部分:特殊字符的转义
特殊字符 | 转义符号 |
& | & |
< | < |
> | > |
" | " |
' | ' |
注意:如果需要表示像&这样一个字符,需要转义成&amp
'' 和 ' 符号的转义一般用于属性值中,& 和 < 和 > 一般用于开始标签与结束标签之间的字符数据中。
字符数据可以是不包括任何标记的起始界定符和CDTA段定界符的任意字符串(即和号“&”和小于号“<”和 符号“]]>”),如:正确:<data>/</data>;错误:<data>&</data>;错误:<data>]]></data>
正确:<data>&</data>
第七部分:处理指令(processing instruction,简称PI)
- PI以“<?”开头,以“?>”结尾。
- XML分析器吧处理指令原封不动传给应用程序,由应用程序来解析这个指令,遵照PI提供的信息要求进行处理。例如,在XML文档中,可以包含以下PI告诉浏览器使用book.css控制其显示效果
<?xml-stylesheet type="text/css" href="book.css"?>
- 示例:本示例通过在demo_PI.xml中设置PI语句引用dog.css控制demo_PI.xml文件在浏览器端的显示效果。
<?xml version="1.0" ?> <?xml-stylesheet type="text/css" href="dog.css" ?> <dog> <name>BigYellow</name> <owner>大傻</owner> <breed>sinoGun</breed> </dog>
name {display:block; color:green}
owner {display:block; color:gray}
breed {display:block; color:blue}
注意:xml-stylesheet处理指令总是放在XML声明之后,第一个元素之前。其它指令可以放在除标记内部和XML声明之前的任何位置。“<?”与“xml-stylesheet”之间不能有空格。
声明:至此,XML基本语法阐述完毕,以上内容为听讲张孝祥老师XML课程后自己做的总结,如有错误之处,恳请指出!