一种可扩展标记语言
XML
对比
XML与HTML比较
- XML严格区分大小写
- XML不能省略结束标记
- XML必须正确嵌套
- XML属性值必须加引号
- HTML将多个连续的空格合并为一个;XML文档中的空格不会被删减
- HTML使用固有的标签,而且都是预定义的;XML没有固有的标签,所有标签是自定义的而且可扩展的
- HTML旨在显示数据,而XML旨在传输数据
- XML和HTML都来源于SGML,XHTML=XML+HTML
XML与JSON比较
- XML格式统一,便于与其他系统交互,共享数据,但文件庞大,格式复杂,解析耗时,传输占宽带
- JSON格式简单,易于读写、解析,占用宽带小,JavaScript原生支持;但不及XML使用广泛通用,在Web Service中使用较少,且不支持注释
XML与YAML比较
- JSON是YAML的子集
XML与Properties比较
- XML是树状结构,Properties是Key-Value键值对形式
XML与INI比较
- XML可以描述复杂数据结构;INI是Key-Value键值对模式,无嵌套,配置简练,适合小程序
用途
存储、传输数据。
语法
-
文档声明
- version属性,encoding属性,standalone属性(默认为true)
<?xml version="1.0" encoding="utf-8"?>
-
元素(标签)
-
有且仅有一个根元素
-
名称不能以数字或者标点符号开始
-
名称不能包含空格
-
名称中间不能包括冒号(:)
-
XML中,空格和换行都作为原始内容被处理
<网址>www.lideyu.com</网址> <!-- 上下两段内容不一样--> <网址> www.lideyu.com </网址>
-
-
属性
- 遵循与元素(标签)相同的命名规范
- 不能包含相同属性名
-
注释
- XML声明之前不能包含注释
<!-- This is a comment -->
-
实体引用(转义字符)
字符 转义字符 描述 < < 小于号 > > 大于号 & & 和号 ” " 引号 ’ ' 撇号 -
CDATA
CDATA 部分中的所有内容都会被解析器忽略,包括转义字符的内容原样输出。
<script> <![CDATA[ function matchwo(a,b){ if (a < b && a < 0) then{ return 1; }else{ return 0; } } ]]> </script>
-
处理指令
处理指令指挥解析引擎如何解析XML文档内容,XML声明语句是最常用的处理指令,通过使用xml-stylesheet指令,通知XML解析引擎应用CSS文件显示XML文档内容。
<?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/css" href="./catalog.css"?> <CATALOG> <CD> <TITLE>Empire Burlesque</TITLE> <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </CATALOG>
CATALOG { background-color: #ffffff; width: 100%; } CD { display: block; margin-bottom: 30pt; margin-left: 0; } TITLE { color: #FF0000; font-size: 20pt; } ARTIST { color: #0000FF; font-size: 20pt; } COUNTRY, PRICE, YEAR, COMPANY { display: block; color: #000000; margin-left: 20pt; }
XML显示效果如图所示:
约束
DTD
-
DTD声明(引用)方式6
-
内部DOCTYPE声明
<!DOCTYPE root-element [element-declarations]>
-
外部文档声明
<!-- 引用本地文件 --> <!DOCTYPE root-element SYSTEM "dtd_file_location"> <!-- 引用外部公共DTD文件 --> <!DOCTYPE root_element PUBLIC "dtd_name" "dtd_file_location">
-
-
元素(标签)语法
<!ELEMENT element-name category> <!-- 或 --> <!ELEMENT element-name (element-content)>
元素类型(category)包括:EMPTY,ANY。
元素内容(element-content)包括字符串和子元素。(#PCDATA),字符串。(child1,child2,…),子元素由逗号分隔时表示子元素按顺序出现;(child1 child2 …),子元素由分隔符分隔时表示子元素中任意一个;子元素由通过*(0-n次),+(至少1次),?(0或1次)指定子元素出现的次数。 <!ELEMENT note (#PCDATA|to|from|header|message)*> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
-
属性语法
<!ATTLIST element-name attribute-name attribute-type attribute-value>
属性类型(attribute-type)和属性值(attribute-value)参考菜鸟教程。
Schema
XML Schema是基于XML的DTD替代者。XML Schema文档扩展名为xsd,即XML Schema Definition78。
XML Schema的元素、类型、属性、限定语法参考菜鸟教程。
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<!--
xmlns:xs="http://www.w3.org/2001/XMLSchema",表示命名空间;
xmlns="http://www.w3schools.com",省略前缀表示默认命名空间;
targetNamespace,表示该Schema文件定义的元素、类型、属性等都属于该命名空间;
elementFormDefault="qualified",表示改Schema文件定义的全局成分和非全局成分都属于targetNamespace申明的命名空间。
-->
<?xml version="1.0"?>
<note
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<!--
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance",用于使用xsi的schemaLocation和noNamespaceSchemaLocation属性;
xsi:schemaLocation,用于引用具有目标命名空间的远端xsd文档;
xsi:noNamespaceSchemaLocation,用于引用具有目标命名空间的本地xsd文档。
-->
DTD与Schema比较
- DTD不遵循XML语法,Schema基于XML,便于解析9
- DTD数据类型有限,且无法自定义数据类型
- DTD不支持命名空间导致命名冲突
解析
DOM(Document Object Model)和SAX(Simple API for XML)是跨语言的解析方式1011,JAXP是解析XML文档的规范(接口),JDK自带XML解析实现为Apache的xerces。
-
JAXP指定解析器提供商工厂类(以DOM为例)12
-
通过设置javax.xml.parsers.DocumentBuilderFactory系统属性
System.setProperty(“javax.xml.parsers.DocumentBuilderFactory”, “工厂实现类名字”);
-
通过在JRE下lib目录下添加jaxp.properties文件
javax.xml.parsers.DocumentBuilderFactory=工厂实现类名字
-
通过服务API,即查找JAR文件中的META-INF\services\javax.xml.parsers.DocumentBuilderFactory文件(该文件无扩展名)
-
平台缺省解析工厂实现类
-
-
DOM13
-
DOM(JAXP)
基于树结构,占用内存大
-
JDOM
-
DOM4J
-
-
SAX(JAXP)
基于事件模型,解析XML时触发一系列事件,占用内存小,但编程难度大,只能查询,且不支持节点上下移动
-
XPath14
简化XML节点查找,Dom4j支持XPath。
XPath的节点选取、限定语、通配符语法参考菜鸟教程。
转换
XML与JavaBean互转
-
JiBX
-
JAXB
JDK自带库