JavaWeb——XML基础

来源:互联网 发布:51单片机蜂鸣器电路 编辑:程序博客网 时间:2024/05/19 02:43

XML基础


本文总结XML,DTD和Schema部分内容, 其中包括核心思想和便于理解的语法规范, 在XML解析部分中, 将介绍Java解析XML文件的基本方法


1. 什么是XML? XML相对于HTML/XHTML的最大不同点什么? 

a. XML= Extensible Markup Language

b. XML和HTML/XHTML最大的却别在于可以自定义标签

c. XML设计的宗旨是为了传输数据而不是显示数据, 而HTML则恰恰相反

d. XML 的优势之一,就是可以经常在不中断应用程序的情况进行扩展


2. XML有哪些应用方面?

a. 保存关系数据

b. 作为配置文件

c. 作为一个小型的数据库

d. 跨平台数据的传输

e. RSS订阅器


3. XML的结构是什么样的, 主要由几个部分组成?

a. 文件声明
b. 处理指令(很少用,可以传入一个CSS|XSL样式表)
c. 根标签
d. 标签
e. 属性

f. 数据


4. XML的语法规范是什么?

a. 文档声明:

- eg. <?xml version="1.0" encoding="utf-8" standalone="yes"?>

a.1 version = "1.0/1.1"

a.2 encoding= "uft-8/*" 

a.3 standalone= "yes/no" (是否需要导入其它文档)

b. 元素:

b.1 标签封闭

b.2 命名规范:

- 区分大小写

- 不能以数字或者标点符号开头

- 不能以xml(如何大小写的变形)开头

- 不能包含空格和":" 于命名空间冲突

- 避免用"." 会误解成对象属性

- 避免用"-",软件读取冲突

b.3 空格换行是有效字符

c. 属性:

c.1 属性必须用" "或者' '

c.2 尽量使用元素来描述数据,仅仅使用属性来提供与数据无关的信息

d. 注释:

d.1 <!--注释内容--> 

d.2 注释不能嵌套

e. CDATA区,特殊字符:

e.1 CharacterDATA: 字符数据, 内部的数据被以字符串的形式解析

e.2 CDATA格式: <![CDATA[<itcast>hahahaha</itcast>]]>

e.3 特殊字符: &gt; &lt; &amp; &quot; &apos; 

e.4 其他字符: 需要查映射表 &#xOOOO;

f. 处理指令: (Processing Instruction)

f.1 PI用于引入文件

f.2 <?xml-stylesheet type="text/css" href="1.css"?>


5. XML的样式太灵活, 不方便Java用一个统一的程序对其进行调用, 那么可以用什么方式约束XML?

a. 两种方式: DTD和Schema来约束XML

b. DTD语法简单, 功能较弱; Schema语法复杂, 功能强大


6. DTD是什么, 他是如何对XML进行约束的?

a. DTD= Document Type Definition

b. DTD中可以构建模块: ELEMENT+ATTLIST+ENTITY+PCDATA+CDATA

c. 限定ELEMENT的子标签+限定ELEMENT的定义顺序+限定ELEMENT的ATTLIST即可限定XML的类型

d. ENTITY可以定义一些重用信息, 简化书写

e. DTD语法中有定义了一些操作符号来简化DTD文件的书写

f.  定义好的DTD文件可以通过两种方式作用于XML文件: 在XML内部中定义这些DTD构建模块+通过地址导入一个DTD文件

g. b,e,f的具体操作参看7


7. DTD的语法规则是什么? 

a. ELEMENT

a.1 <子标签> 

 <!ELEMENT 父标签  <有空格>  ( 下级子标签 ) >

a.2 <特殊标签>

- EMPTY 表示无下级子标签 <!ELEMENT root EMPTY>

- ANY 表示下级可以有仁义的子标签<!ELEMENT root ANY>

- 尽管ANY表示可以有任意子标签, 但是这些标签必须是定义过的

a.3 <元素间关系>

-     , 表示并列全取关系 <!ELEMENT student (name,age)>, 子标签必须按顺序定义

-     | 表示并列单取关系 <!ELEMENT grade(A|B|C|D|F)>

a.4 <单元素修饰>

出现至少1次

- 出现至少0次

- ?出现最多1次

-   出现且仅出现1次

a.5 <混合使用+整体打包>

- <!ELEMENT MYFILE ((TITLE*,AUTHOR?,EMAIL)* | COMMENT)>

b. ATTLITST

b.1  <!ATTLIST  car(元素名) color(属性名) CDATA(属性类型) #REQUIRED(属性值要求)> 

b.2 属性类型:

- CDATA: 字符数据

- (em1 | em2 | ...) : 枚举值, 只能取其中一个

- ID: ID类型——只能以字母或_开头

b.3 属性值要求:

- #REQUIRED: 必须要制定的

- #IMPLED: 可规定也可不规定的

- #FIXED 值: 固定值 (如果写出此属性, 必须是给定值) 

- default值: 不设置则为此default值

c. ENTITY:

c.1 内部实体: <!ENTITY 实体名称 “实体值”>

c.2 外部实体: <!ENTITY 实体名称 SYSTEM "URI/URL">

c.3 文件中引用内部/外部实体: &实体名称;

c.4 DTD中引用参数实体: <!ENTITY % 实体名称 “参数实体部分”>

<!ENTITY % TIP “(TITLE*,AUTHOR?,EMAIL)”>

<!ELEMENT MYFILE (%TIP;* | COMMENT)>

d. 声明引入DTD (内部/本地/网络)

d.1 <!DOCTYPE 根元素 [ DTD文件中内容]>

d.2 <!DOCTYPE 根元素 SYSTEM "路径">

d.3 <!DOCTYPE 根元素 PUBLIC "DTD名称" "路径">


8. Schema是什么, 它有什么好处?

a. Schema是基于XML语法规则的对XML文档的一种描述

b. Schema要通过更高级的类型限定来检测XML的定义/数据类型错误

c. Schema可作为XSD(XML Schema Definition) 导入XML并对改XML进行约束

d. Schema的好处是:

d.1 基于XML编写, 无需另外的解析器

d.2 支持数据类型, 更方便监测数据错误

d.3 支持命名空间, 避免命名冲突

d.4 可以针对未来的需求进行扩展, 兼容未知, 或暂未定义的标签


9. Schema的语法结构是什么?

a. Schema的一些规范标签定义在 xmlns: xs= “http://www.w3.org/XMLSchema” 内

b. 应用这些标签的合理组合, 并基于XML的基本语法就可以进行Schema的编写

c. Schema的基本标签是<xs:element name type>; element包括: simpleType | complexType

c.1 simpleType: 只包含文本, 不包含element/attribute子元素 (simpleType一般不用书写标签, 而且simpleType的元素可以单标签封闭)

c.2 complexType: 包含element/attribute子元素(文本有无均可)

c.2.1 其中限定不包括element子元素的需要被定义为<xs:simpleComponent> 

<xs:schema>    <xs:complexType>       <xs:simpleComponent>          <xs:element name="price" type="xs:double">             <xs:attribute name="kind" type="xs:string">             </xs:attribute>          </xs:element>       </xs:simpleComponent>    </xs:complexType></xs:schema>

c.2.2 其中包括element子元素的是<xs:complexComponent>, complexType下默认是complexComponent

c.2.3 同时包含文本和element/attribute子元素, 需要标记 <xs:complexType mixed="true“>

c.3 simpleType/complexType是XSD中书写是否有子元素来区分的(element/attribute子元素)

c.4 simpleComponent/complexComponent 是XSD限定的元素在XML是否有子元素来区别的(各种XSD中定义的子元素)

d. Schema定义属性的标签是 <xs:attribute name type>

e. Schema对类型的限定标签是 <xs:restriction base>

f. Schema-restriction内的数据类型限定标签: enumeration+length+pattern+whiteSpace+ ....

g. Schema提供了指示器来实现对单个元素或多个元素的控制

g.1 多个元素Order指示器: <xs:sequence> <xs:choice> <xs:all> (注意没有enumeration, 是choice)

g.2 单个元素Occurrence指示器: <xs:maxOccurs> <xs:minOccurs>

g.3 多个元素/属性打包Group指示器: <xs:group name> <xs:attributeGroup name>

h. Schema提供了<xs:any> <xs:anyAttribute>来可以兼容/扩展未定义元素和属性

i. Schema提供了定义元素的名称替换属性substitutionGroup: 

- <xs:element name="alias"  substitutionGroup="orignal">

j. Schema提供了 ref这个属性可以指向一个定义过了的元素/属性: 

- <xs:element name="original"> ... ... ... </ xs:element>

- <xs:element ref="original"/> (Schema文档定义模式2)

k. Schema可以将type抽离出element, 这种定义也可以使文档看起来更清晰 

- <xs:complexType name="OneType"> ... ... ... </xs:complexType> 

- <xs:element name="OneElement" type="OneType"/>(Schema文档定义模式3)

l. Schema还提供了一种类似继承的功能:

-  <xs: extension base="baseName"> 基于一个定义了的type创建一个新的type可以添加新的元素或属性


10. 基于以上的语法, 如何用Schema定义XSD文档?

a. 有三种模式可以定义XSD文档

a.1 按照DTD的模式: 从头到尾依次定义

a.2 利用 ref属性: 

a.2.1 先定义好simpleType的<element name="simpleLeafElement" />

a.2.2 利用ref加载simpleType于complexType (利用对name的引用)

a.2.3 在将简单的complexType装配到复杂的rootElement上最终合成根元素的complexType组装体

a.2.4 特点是逆向元素组装 

<xs:element name="rootElement"><xs:complexType><xs:element ref="xxx" /><xs:element ref="xxx" /> ... ... ...</xs:complexType></xs:element>

a.3  利用Type的组装简化ref的过程, 将所有的element都变成simpleType的element

a.3.1 先定义好叶元素的type<simpleType name="simpleLeafType">

a.3.2 再定义complexType, 组装应用了前面定义过的tpye赋值给<element name="xxx” type="definedType"/> (注意: 此时就可以把所有的element都转化成simpleType的)

a.3.3 组装type直到得到得到根类型的rootTpye

a.3.4 最后将rootType赋给根元素rootElement

a.3.5 特点是类型抽离,类型逆向组装, 所有元素最简,单便签封闭

<xs:complexType name="rootType"><xs:element name="xxx" type="xxx" /><xs:element name="xxx" type="xxx" /> ... ... ...</xs:complexType><xs:element name="rootElement" type="rootType" />

b. 推荐使用a.3的模式, 其优点是:

-  将元素和类型分离, 元素全部变成但标签的simpleTpye类型, 文档十分清晰

-  相比较a.2省去了ref和大量书写<xs:complexTpye></xs:complexType>的过程

-  便于修改和维护代码


参考资料: 

[1] w3cschool教程 http://www.w3school.com.cn/x.asp

[2] 传智博客赵君JavaWeb视频教程