XML篇
什么是xml?
- XML 指可扩展标记语言Extensible Markup Language,被设计用来传输和存储数据。
- XML 是独立于软件和硬件的信息传输工具。
与html的区别?
一个简单xml实例
<?xml version="1.0" encoding="UTF-8"?> <bookstore> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book> .... </book> </bookstore>
- 第一行定义了 XML 的版本 (1.0) 和所使用的编码UTF-8
- 第二行是根结点开始
- 中间部分是子元素,其中
<book></book>
是一个子节点,中间有4个子节点,<title></title>
结点包含属性lang
- 最后一行是根结点结束
xml一些重要的语法规则
替换字符 原字符 说明 <
< 小于 >
> 大于 &
& 和 '
‘ 单引号 "
“ 双引号 xml的命名规则
xml属性和元素的使用
示例
<!--示例1--> <note date="08/08/2008"> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note> <!--示例2--> <note id="1"> <date> <day>08</day> <month>08</month> <year>2008</year> </date> <to>George</to> ... </note>
分析
最佳实践:
元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。
xml验证
- 拥有正确语法的 XML 被称为“形式良好”的 XML。
验证方式
- XML DTD
- XML Schema:W3C 支持一种基于 XML 的 DTD 代替者。
XML DTD
- 定义:DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块,它使用一系列的合法元素来定义文档结构。
使用方式:
可以在xml中直接定义
<!DOCTYPE 根元素 [元素声明]> <?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <!--PCDATA 的意思是被解析的字符数据(parsed character data,--> <!--可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本--> <!--文本中的标签会被当作标记来处理,而实体会被展开--> <!-- CDATA 的意思是字符数据(character data)--> <!--是不会被解析器解析的文本--> <!--本中的标签不会被当作标记来对待,其中的实体也不会被展开--> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note> <!--!DOCTYPE note (第二行)定义此文档是 note 类型的文档。 --> <!--!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"--> <!--!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型--> <!--from,body同上to-->
通过外部引入(常用)
<!DOCTYPE 根元素 SYSTEM "文件名"> <?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note> <!--这是包含 DTD 的 "note.dtd" 文件 --> <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
为什么使用DTD?
实际应用
- struts2的配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <!--根元素为struts--> <struts> <!--内部的标签都在struts-2.3dtd中定义--> ... </struts> ``` + mybaits3的mapper配置文件 ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--根元素为mapper--> <mapper namespace="*Dao"> <resultMap type="" id=""> ... </resultMap> </mapper>
- struts2的配置文件
XML Schema
定义:基于 XML 的 DTD 替代者,描述 XML 文档的结构。XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),比DTD更强大。
xml schema的优势
xml schema的使用
xml DTD章节中,我们给出了DTD的定义过程,根据同样的xml例子,给出schema的定义过程,下面文件的为note.xsd:
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3school.com.cn" xmlns="http://www.w3school.com.cn" 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>
分析上诉schema的定义
<schema>
元素是每一个 XML Schema 的根元素。xmlns:xs="http://www.w3.org/2001/XMLSchema"
,显示 schema 中用到的元素和数据类型来自该命名空间,同时它还规定了来自该命名空间的元素和数据类型应该使用前缀xs:
。targetNamespace="http://www.w3school.com.cn"
,显示被此 schema 定义的元素 (note,to,body) 来自该命名空间。xmlns="http://www.w3school.com.cn"
,指出默认的命名空间,在xml中引入时要使用的。elementFormDefault="qualified"
,指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。定义简易元素
<xs:element name="xxx" type="yyy"/>,如上诉的<xs:element name="to" type="xs:string"/>
。此处 xxx 指元素的名称,yyy 指元素的数据类型。XML Schema中的常用类型有:
xs:string、xs:decimal、xs:integer、xs:boolean、xs:date、xs:time
。如果element是一个复杂类型,则如上诉<xs:element name="note"><xs:complexType>...</xs:complexType></xs:element>
。简易元素的默认值或固定值定义
<xs:element name="color" type="xs:string" default="red"/> <xs:element name="color" type="xs:string" fixed="red"/>
定义属性
- 上诉的简易元素其实就是对应xml中的结点,属性就是结点里面的属性。定义的属性,可以用在同一命名空间下的任意元素中。
<xs:attribute name="xxx" type="yyy"/>
,通过该方式进行定义,其他类似于<xs:element/>
。属性的赋值
<!--默认值--> <xs:attribute name="lang" type="xs:string" default="EN"/> <!--固定值--> <xs:attribute name="lang" type="xs:string" fixed="EN"/> <!--可选的和必需的属性--> <xs:attribute name="lang" type="xs:string" use="required"/>
在xml中使用xml schema
“`xml
JSON篇
JSON的主流解析框架
- fastjson: https://github.com/alibaba/fastjson (被认为序列化和反序列化的性能都比其他框架好)
- 待完善….