当前位置 博文首页 > 蚂蚁小哥:XML从入门到深入(超详细)
XML (eXtensible Markup Language)指可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。XML可以标记数据、定义数据类型,可以允许用户对自己标记语言进行自定义,是对人和机器都比较友好的数据承载方式;XML其前身是SGML(标准通用标记语言)。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <Students> <Student> <name>蚂蚁小哥</name> <address>安徽六安</address> </Student> <Student> <name>欧阳康康</name> <address>安徽六安</address> </Student> </Students>
①:XML 中的每个元素都是成对出现的,有开始和结束,自闭和标签除外,但是都得有 '/'结束标志
如:<student>xxxxx</student> 自闭和:<student name='xxx' />
②:每个XML文档都有且只有一个根元素(Root Element)
③:XML标签对大小写敏感
④:XML必须正确嵌套
⑤:同级标签以所缩进对齐
⑥:元素名称可以包含字母,数字,但不能以数字开头
⑦:元素名称中不能含有空格 或者 ' : '号
⑧:如出现特殊字符需要转义 如:<,>,",',&....
优点:
①:XML是使用信息自描述的新语言(没有约束的情况下)
②:信息共享(自定义数据格式,而且很容易使用工具读写)
③:数据传递(支持各种通道传递数据,如WebService就使用XML传输数据)
④:数据重用、分离数据和显示、文档包含语义、方便阅读有面向对象的树形结构
缺点:
①:数据量大是传输效果不好,因为XML定义了和数据无关的标签
第一行必须是XML的声明<?xml ?> version:xml的版本,必须设定,当前只有'1.0'版本 encoding:当前xml里面的数据格式,默认UTF-8 standalone:标记是否是一个独立的xml,默认yes 如果设置 no 表示这个XML不是独立的而是依赖于外部的DTD约束文件(后面说) <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <Students> <Student> <name>蚂蚁小哥</name> <address>安徽六安</address> </Student> </Students>
XML其实是有专用的标记,也可以理解是XML的基本语法,但是这些语法你在看HTML语法时也看到过,因它们都属于一个大家族,只是应用的方向不一样而导致的差异有部分不一样
语法:<!-- 这是一个注释 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <School> <!--定义学生对象 这是一个注释--> <Student id="st01" name="张三" age="23"/> </School>
①:注释里的内容不要出现 --
②:不要把注释写在元素中间 如<Student <!--这里注释报错--> ></Student>
③:注释不可嵌套
其实XML里的PI指令大家可以理解为XML设置样式的,但是考虑到XML是用于存储数据的载体,所以这个指令用的也不多
语法:<?目标 指令?>
如引入CSS样式:<?xml-stylesheet type='css类型' href='引入css样式地址'>
CSS类型可以设置 type='text/css' type='text/xsl'
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <!--引入PI指令 注意只能放在头部 并引入style.css样式--> <?xml-stylesheet type='text/css' href='./style.css' ?> <School> <!--定义学生对象 这是一个注释--> <Student> <name>蚂蚁小哥</name> </Student> </School> <!--CSS样式--> name { font: normal 500 22px "微软雅黑"; color:#f69; }
用于把整段文本解析为纯字符串数据而不是标记的情况,其实包含在CDATA节中的特殊字符<、>、&都会当作字符展示
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <School> <!--定义学生对象 这是一个注释--> <Student> <!--使用<![CDATA[xxx]]>可以把特殊字符当作文本--> <name><![CDATA[我是一个"文本":想不到把]]></name> </Student> </School>
那么问题来的,如果我不使用CDATA节包裹的话在文本区域输入<,>等就会和关键字符冲突,我们需要使用转义
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <School> <!--定义学生对象 这是一个注释--> <Student> <!--这里的蚂蚁小< > 哥报错 <>干扰,我们要使用转义--> <!--<name>蚂蚁小<>哥</name>--> <name>蚂蚁小<>哥</name> </Student> </School> <!--常用网页转义字符 xml也可以使用--> <!-- 显示结果 描述 实体名称 实体编号 空格   < 小于号 < < > 大于号 > > & 和号 & & " 引号 " " ' 撇号 '(IE不支持) ' ¢ 分 ¢ ¢ £ 镑 £ £ ¥ 日圆 ¥ ¥ § 节 § § ? 版权 © © ? 注册商标 ® ® × 乘号 × × ÷ 除号 ÷ ÷ -->
DTD是文档类型定义(Document Type Definiyion),它是用来描述XML文档结构,一个DTD文档会包含如下内容:
元素(ELEMENT):的定义规则,描述元素之间的关系规则
属性(ATTLIST):的定义规则,可以定义具体的标签内部属性
为什么使用DTD:
①:DTD文档与XML文档实例关系如类与对象关系
②:有了DTD,每个XML文件可以携带一个自身格式描述
③:有了DTD,不同组织的人可以使用一个通用DTD来交换数据
④:应用程序可以使用一个标准的DTD校验从外部世界接受来的XML是否是一个有效标准XML
⑤:可以使用DTD校验自己的XML数据
DTD文档的声明及引用有三种: 内部DTD文档: <!DOCTYPE 根元素[定义元素属性等等内容]> 外部DTD文档: <!DOCTYPE 根元素 SYSTEM 'DTD文件路径'> 内外部DTD文档结合: <!DOCTYPE 根元素 SYSTEM 'DTD文件路径'[定义元素属性等等内容]>
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <!--注:此时我这里面的 ELEMENT 定义元素的我后面介绍--> <!DOCTYPE Student[ <!ELEMENT Student (name)> <!ELEMENT name (#PCDATA)> ]> <Student> <name>蚂蚁小哥</name> </Student>
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <!DOCTYPE Student SYSTEM './st.dtd'> <Student> <name>蚂蚁小哥</name> </Student> <!--下面是文件 st.dtd--> <!DOCTYPE Student[ <!ELEMENT Student (name)> <!ELEMENT name (#PCDATA)> ]>
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <!DOCTYPE Student SYSTEM './st.dtd'[ <!ELEMENT Student (name,age,sex)> <!ELEMENT sex (#PCDATA)> ]> <Student> <name>蚂蚁小哥</name> <age>23</age> <sex>男</sex> </Student> <!--外部引用的st.dtd文件--> <?xml version="1.0" encoding="UTF-8" ?> <!--这里不能写DOCTYPE,因为这个可以当作元素引用,具体规则在上面定义--> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)>
语法:<!ELEMENT 元素名称(NAME) 元素类型(COUTENT)> 注:ELEMENT关键字 元素名称:就是自定义的子标签名称 元素类型: EMPTY:该元素不能包含子元素和文本,但是可以有属性,这类元素称为自闭和标签 ANY:该元素可以包含任意在DTD中定义的元素内容 #PCDATA:可以包含任何字符数据,设置这个就不能包含子元素了,一般设置具体value 混合元素类型:只包含子元素,并且这些子元素没有文本 混合类型:包含子元素和文本数据混合体
<!-- 定义空元素EMPTY --> <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <!DOCTYPE Student[ <!ELEMENT Student EMPTY> ]> <!--约束为空元素 所以写成自闭和标签,--> <Student/> <!-- 定义组合元素(student,teacher)并为每个元素设置类型(#PCDATA) --> <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <!DOCTYPE School[ <!ELEMENT School (student,teacher)> <!ELEMENT student (#PCDATA)> <!ELEMENT teacher (#PCDATA)> ]> <School> <student>我是学生</student> <teacher>我是老师</teacher> </School> <!-- 设置任意元素ANY 虽然student元素内部没有再设置元素而设置ANY,那我就可以 在编写任意子元素,前提在里面有定义 --> <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <!DOCTYPE School[ <!ELEMENT School (student)>