XML篇
-
@H_502_7@
什么是xml?
@H_502_7@与html的区别?
-
@H_502_7@XML 被设计为传输和存储数据,其焦点是数据的内容 。
@H_502_7@HTML 被设计用来显示数据,其焦点是数据的外观。
@H_502_7@HTML 旨在显示信息,而 XML 旨在传输信息。
@H_502_7@XML是没有预定于标签的,需要用户自己来定义。而不像HTML那样,存在预定义的标签,如
<p>
、<h1>
、<table>
等。
一个简单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>
-
@H_502_7@第一行定义了 XML 的版本 (1.0) 和所使用的编码UTF-8
@H_502_7@第二行是根结点开始
@H_502_7@中间部分是子元素,其中
<book></book>
是一个子节点,中间有4个子节点,<title></title>
结点包含属性lang
@H_502_7@最后一行是根结点结束
xml一些重要的语法规则
-
@H_502_7@所有 XML 元素都须有关闭标签,也就是成对出现。
@H_502_7@XML 标签对大小写敏感。
@H_502_7@XML 文档必须有根元素。
@H_502_7@XML 的属性值须加引号,单引号或双引号。
@H_502_7@在XML当中的一个特殊字符的使用
替换字符 | 原字符 | 说明 |
---|---|---|
< |
< | 小于 |
> |
> | 大于 |
& |
& | 和 |
' |
‘ | 单引号 |
" |
“ | 双引号 |
xml的命名规则
@H_502_7@xml属性和元素的使用
-
@H_502_7@
示例
<!--示例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>
@H_502_7@分析
-
@H_502_7@示例1中,date属于数据本身,不宜作为属性来表示。date=”08/08/2008”,不便于应用程序的访问和处理。需要分隔该字符串,来获得年月日的信息。
@H_502_7@示例2中,date属于元素,其中又包含了年月日三个子元素。将时间数据分开表示,应用程序可以任意获取年月日中的数值。而且如果我要精确到时间,只要在添加一个
<time></time>
。因此,扩展性非常好,不影响程序的访问。而对于属性id来说,是作为此元素的标识,相当于元数据,不是数据本身,可以考虑使用。
最佳实践:
元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。
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-->
@H_502_7@通过外部引入(常用)
<!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)>
@H_502_7@为什么使用DTD?
-
@H_502_7@独立的团体可一致地使用某个标准的 DTD 来交换数据。就是可以保证大家使用的该xml标签结构是一致的。
@H_502_7@DTD 来验证从外部接收到的数据。 采用DTD的话,来保证当前锁处理的xm确实是大家所统一使用的,如果出现其他异常标签在里面,验证不通过。
实际应用
<?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>
@H_502_7@XML Schema
-
@H_502_7@
定义:基于 XML 的 DTD 替代者,描述 XML 文档的结构。XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),比DTD更强大。
-
@H_502_7@定义可出现在文档中的元素、属性
@H_502_7@定义哪个元素是子元素、子元素的次序和数目
@H_502_7@定义元素是否为空,或者是否可包含文本
@H_502_7@定义元素和属性的数据类型
@H_502_7@定义元素和属性的默认值以及固定值
xml schema的优势
-
@H_502_7@可针对未来的需求进行扩展,更完善,功能更强大
@H_502_7@基于 XML 编写,支持数据类型和命名空间
@H_502_7@DTD的不足:通过DTD的验证,xml是形式良好的。但仅仅形式良好,还不能够保证xml不出错误
xml schema的使用
<?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>
@H_502_7@分析上诉schema的定义
-
@H_502_7@
<schema>
元素是每一个 XML Schema 的根元素。
@H_502_7@xmlns:xs="http://www.w3.org/2001/XMLSchema"
,显示 schema 中用到的元素和数据类型来自该命名空间,同时它还规定了来自该命名空间的元素和数据类型应该使用前缀 xs:
。
@H_502_7@targetNamespace="http://www.w3school.com.cn"
,显示被此 schema 定义的元素 (note,to,body) 来自该命名空间。
@H_502_7@xmlns="http://www.w3school.com.cn"
,指出默认的命名空间,在xml中引入时要使用的。
@H_502_7@elementFormDefault="qualified"
,指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。
@H_502_7@定义简易元素
-
@H_502_7@
<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"/>
@H_502_7@定义属性
-
@H_502_7@上诉的简易元素其实就是对应xml中的结点,属性就是结点里面的属性。定义的属性,可以用在同一命名空间下的任意元素中。
@H_502_7@
<xs:attribute name="xxx" type="yyy"/>
,通过该方式进行定义,其他类似于<xs:element/>
。
@H_502_7@属性的赋值
<!--默认值-->
<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"/>
@H_502_7@在xml中使用xml schema
“`xml
JSON篇
-
@H_502_7@
参考:http://json.org/json-zh.html
@H_502_7@JSON的主流解析框架
-
@H_502_7@fastjson: https://github.com/alibaba/fastjson (被认为序列化和反序列化的性能都比其他框架好)
@H_502_7@待完善….