一、xml入门
1. 什么是xml
l xml全称为ExtensibleMarkup Language,可扩展标记语言。xml技术是W3C组织发布的,目前推荐遵循的是W3C组织于2000发布的XML1.0规范。 html 也是w3c组织发布的。
l xml可用于保存关系数据
l xml也经常被用作软件的配置文件,描述软件模块之间的关系
l 一个软件在设计的时候不能完全确定将来启动的具体模块,为了提高程序的灵活性,它所启动的模块通常是由其配置文件来决定的,这样的情况用xml文件最合适不过
例如: 一个软件在启动的时候需要A、B两大模块,A、B模块在启动时又需要启动程序a1、a2和b1、b2
2. xml用于描述关系型数据
二、xml语法
1. 文档声明
l 在编写XML文档时,需要先使用文档声明,声明XML文档的类型
l 最简单的声明语法:
<?xmlversion="1.0" ?>
l 用encoding属性说明文档的字符编码:
<?xmlversion="1.0" encoding=“gb2312"?>
(xml文档以什么编码保存,就要以什么编码打开)
l 用standalone属性说明文档是否独立:
<?xmlversion="1.0" encoding=“gb2312" standalone="yes" ?>
一般来讲,xml文件会伴随着一个约束文件
2. xml元素
什么是xml元素
l XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式,例如:
• 包含标签体:<a>www.itcast.cn</a>
• 不含标签体的:<a></a>, 简写为:<a/>
l 一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套 ,例如:
<a>welcometo <b>www.it315.org</a></b>
l 格式良好的XML文档必须有且仅有一个根标签,其它标签都是这个根标签的子孙标签。
l 对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。
xml元素的命名规范
一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
l 区分大小写,例如,<P>和<p>是两个不同的标记。
l Html不区分大小写
l 线不能以数字或"_" (下划)开头。
l 不能以xml(或XML、或Xml 等)开头。
l 不能包含空格。
l 名称中间不能包含冒号(:)。
l 把握一个原则:全部用英文字母,实在不得已后面加点数字
3. 元素的属性
l 一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:<input name=“text”>
l 属性值一定要用双引号(“)或单引号(‘)引起来
l 定义属性必须遵循与标签相同的命名规范 (全用英文)
l 多学一招:在XML技术中,标签属性所代表的信息,也可以被改成用子元素的形式来描述,例如:
<input>
<name>text</name>
</input>
4. xml中的注释
l xml文件中的注释采用:“<!--注释-->” 格式。
l 注意:
• XML声明之前不能有注释
• 注释不能嵌套,例如:
<!--大段注释
……
<!--局部注释-->
……
-->
5. CDATA区
l 在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。
l 遇到此种情况,可以把这些内容放在CDATA区里,对CDATA
区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。(c : Character)
l 语法:<![CDATA[ 内容 ]]>
l 例:
<![CDATA[
<itcast>
<br/>
</itcast>
]]>
6. 转义字符
l 对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。
重点:
必须有文档声明, encoding指定文件的编码
严格区分大小写
CDATA区域 <![CDATA[……]]>
关键字符需要转义
三、xml文档约束
l 什么是XML约束
• 在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
l 为什么需要XML约束
• 将xml文档作为配置文件时,xml中的元素写法一定不是任意的,
必须要遵循软件的要求来写,这样的xml文档软件才能识别,例如
在写tomcat服务器的配置文件时,哪个元素是用于指定端口,哪个
元素用户指定主机名,这些一定是事先就约定好的,这些约定就
需要通过xml约束技术来完成
l 常用的约束技术
• XML DTD
• XML Schema
四、 DTD约束
1. 定义
DTD(Document Type Definition),全称为文档类型定义。
l 下面的例子为 xml 和对应的 dtd 约束 dtd文档必须为 utf-8 编码
book.xml
<?xmlversion="1.0" ?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>39.00元</售价>
</书>
<书>
<书名>JavaScript网页开发</书名>
<作者>张孝祥</作者>
<售价>28.00元</售价>
</书>
</书架>
book.dtd
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
l 可以在在xml文件内直接编写DTD
<?xmlversion="1.0" encoding="UTF-8"standalone="yes"?>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
<书架>
<书>
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>39.00元</售价>
</书>
...
</书架>
2. 如何引入dtd约束
l XML文件使用 DOCTYPE 声明语句来指明它所遵循的DTD文件,DOCTYPE声明语句有两种形式:
l 当引用的文件在本地时,采用如下方式:
<!DOCTYPE文档根结点 SYSTEM"DTD文件的URL">
例如: <!DOCTYPE 书架 SYSTEM “book.dtd”>。
l 当引用的文件是一个公共的文件时,采用如下方式:
<!DOCTYPE 文档根结点 PUBLIC "DTD名称""DTD文件的URL">
例如:<!DOCTYPE web-app PUBLIC
"-//SunMicrosystems, Inc.//DTD Web Application 2.3//EN“
"http://java.sun.com/dtd/web-app_2_3.dtd">
3. 元素的定义
l 在DTD文档中使用ELEMENT声明一个XML元素,
语法格式如下所示:
<!ELEMENT 元素名称元素类型>
l 元素类型可以是元素内容、或类型
如为元素内容:则需要使用()括起来,如
<!ELEMENT 书架 (书名,作者,售价)> 复杂元素
<!ELEMENT 书名(#PCDATA)> 简单元素
如为元素类型,则直接书写,如下:
<!ELEMENT 书架 EMPTY>
EMPTY:用于定义空元素,例如<br/><hr/>
ANY:表示元素内容为任意类型。
l 元素内容中可以使用如下方式,描述内容的组成关系
• 用逗号分隔,表示内容的出现顺序必须与声明时一致。
<!ELEMENTMYFILE (TITLE,AUTHOR,EMAIL)>
• 用|分隔,表示任选其一,即多个只能出现一个
<!ELEMENTMYFILE (TITLE|AUTHOR|EMAIL)>
l 在元素内容中也可以使用+、*、?等符号表示元素出现的次数:
+:一次或多次 (书+)
?: 0次或一次 (书?)
*:0次或多次 (书*)
l 也可使用圆括号( )批量设置,例
<!ELEMENTMYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
4. 属性的定义
l xml文档中的标签属性需通过ATTLIST为其设置属性
• 语法格式 (Attribute)
<!ATTLIST元素名
属性名1属性值类型 设置说明
属性名2属性值类型 设置说明
……
>
• 举例:
<!ATTLIST 商品
类别 CDATA #REQUIRED
颜色 CDATA #IMPLIED
>
• 对应XML文件:
<商品类别="服装" 颜色="黄色">…</商品>
<商品类别="服装">…</商品>
l 设置说明:
• #REQUIRED:必须设置该属性
• #IMPLIED:可以设置也可以不设置
• #FIXED:说明该属性的取值固定为一个值,在XML 文件中不能为该属性设置其它值。但需要为该属性提供这个值
• 直接使用默认值:在 XML 中可以设置该值也可以不设置该属性值。若没设置则使用默认值。
l 举例:
<!ATTLIST 页面作者
姓名 CDATA #IMPLIED
年龄 CDATA #IMPLIED
联系信息 CDATA #REQUIRED
网站职务 CDATA #FIXED "页面作者"
个人爱好 CDATA "上网"
>
5. 常用属性值类型
l CDATA:表示属性值为普通文本字符串。
l ENUMERATED
l ID
属性值类型之ENUMERATED
l 属性的类型可以是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值(枚举)
<?xml version = "1.0"encoding="GB2312" standalone="yes"?>
<!DOCTYPE 购物篮 [
<!ELEMENT肉 EMPTY>
<!ATTLIST肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]>
<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉/>
</购物篮>
属性值类型之ID
l 表示属性的设置值为一个唯一值。
l ID 属性的值只能由字母,下划线开始,不能出现空白字符
l 记住,不能数字开头,尽量用英文
<?xml version= "1.0" encoding="GB2312" ?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名,EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
<!ATTLIST 联系人编号 ID #REQUIRED>
]>
<联系人列表>
<联系人编号=“a1">
<姓名>张三</姓名>
<EMAIL>zhang@it315.org</EMAIL>
</联系人>
<联系人编号=“a2">
<姓名>李四</姓名>
<EMAIL>li@it315.org</EMAIL>
</联系人>
</联系人列表>
6.实体的定义
l 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
l 在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。
l 实体可分为两种类型:引用实体和参数实体。
引用实体
l 引用实体主要在 XML 文档中被应用
l 语法格式:
• <!ENTITY 实体名称 “实体内容” >:直接转变成实体内容
l 引用方式: &实体名称;
l 举例:
<!ENTITYcopyright “I am aprogrammer">
……
©right;
参数实体
l 参数实体被 DTD 文件自身使用
l 语法格式:
<!ENTITY % 实体名称"实体内容" >
l 引用方式:
%实体名称;
l 举例:
<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
……
<!ELEMENT 客户信息 (%TAG_NAMES; | 公司名)>
五、XML Schema 约束
六、xml解析
l XML解析方式分为两种:dom和sax
• dom:(Document ObjectModel, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。
• sax: (Simple API forXML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。
l XML解析器
• Crimson(sun)、Xerces(IBM)、Aelfred2(dom4j)
l XML解析开发包(API)
• Jaxp(sun)、Jdom、dom4j(全新的api)、pull解析(Andriod的sdk自带pull解析)
1. jaxp 解析
l JAXP 是sun公司推出的一套解析XML文档的API,该API是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax包及其子包组成
l JAXP支持两种方式(DOM和SAX)对XML文档进行解析,两种方式思路类似,都需要通过调用工厂类得方法来获得解析器,进而通过解析器对文档进行解析
Dom解析
l 通过工厂类DocumentBuilderFactory的newDocumentBuilder方法来获得解析器对象
DocumentBuilder
l 调用parse方法对文档进行解析,获得代表整个文档的Document
对象,进而获得代表文档中的其他元素节点的对象
l Node对象代表节点,它所有元素类型的父类
l Element对象表示元素节点
l Attr对象表示属性节点
l Text对象表示文本节点
l Comment对象表示注释节点
l Transformer对象用于将Document对象重新写入xml文档
Sax解析
通过事件触发的方式,不需要加载整篇文档,解析器解析到xml的每个组成部分都会触发不同的方法
在解析文档之前,需要实现绑定事件处理器
2. pull解析
l 进行 Android 开发时,sdk中对pull解析提供了支持
l pull 采用事件触发的方式解析 xml 文档
l pull 解析文档时需要使用XmlPullParser对象,通过工厂类来获得
l pull 创建新文档需要使用XmlSerializer对象,设置各种节点,通过setOutput方法写入流
3.dom4j解析
l Dom4j是一个非常优秀的Java XMLAPI,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,
例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
查看 api 文档完成对 xml 的增删改查
使用dom方式解析一个xml文件
1、 创建工厂
2、 创建解析器对象
3、 解析xml文档 获得代表整个xml文档的document对象
4、 查看第二本书的书名
5、 更新XML文件(需要Transformer类)
使用SAX方式解析XML文件
1、 通过工厂(SAXParserFactory)类获得解析器
2、 获得内部读取器Reader
3、 绑定内容处理器
4、 读取xml文件