XML编程
主要内容:
- XML及其语法
- XML约束之DTD
- XML编程(CRUD - Create Read Update Delete)
- XML约束之Schema
XML概述
什么是XML
- XML是指可扩展标记语言(eXtensible Markup Language),他是一种标记语言,非常相似HTML,他被设计的宗旨是数据传输,而非显示数据。
- XML标签没有被提前定义。须要用户自行定义标签。
- XML技术是W3C组织(World Wide Web Consortium 万维网联盟)公布的,眼下遵循的是W3C组织于2000年公布的XML1.0规范。
- XML被广泛觉得是继Java之后在Internet上最激动人心的心技术。
XML技术用于解决什么问题
<中国><北京><丰台></丰台><海淀></海淀></北京><安徽><合肥></合肥><黄山></黄山></安徽></中国>
- XML是一种通用的数据交换格式
- 在XML语言中,他同意用户自己定义标签。一个标签用于描写叙述一段数据,一个标签可分为起始标签和结束标签,在标签之间,又能够使用其它标签描写叙述其它数据,以此来实现数据关系的描写叙述。
- XML中的数据必须通过软件程序来解析运行或显示。如IE,这样的解释程序表示Parser解释器。
XML常见的应用
- 在Java开发中。传统的配置文件是*.properties属性文件(key=value),而XML表示的数据更为丰富。
- XML技术除用于描写叙述有关系的数据外,还经经常使用作配置文件,以描写叙述程序模块之间的关系。
(后面学习的Struts、Spring、Hibernate都是基于XML作为配置文件的)
- 在一个软件系统中,通过XML配置文件能够提高系统的灵活性。即程序的行为是通过XML文件来配置的,而不是硬编码。
XML语法
XML文档的组成
- 文档声明
- 元素
- 元素的属性
- 凝视
- CDATA区
- 特殊字符
- 处理指令(PI:Processing Instruction)
文档声明
- 在编写XML文档时,须要先使用文档声明来声明XML文档,且必须出如今文档的第一行。
- 最简洁的语法:
元素
- XML元素指XML文件里出现的标签、一个标签分为起始标签和结束标签(不能省略)。
一个标签有例如以下书写形式:
- 包括标签主体:
<mytag>context</mytag>
- 不含标签主体:
<mytag/>
- 包括标签主体:
- 一个标签中能够嵌套若干子标签,可是全部标签必须合理的嵌套。不同意有交叉嵌套。
- 一个XML文档必须有且仅有一个跟标签,其它标签都是这个跟标签的字标签或孙标签。
- XML中不会忽略主体中的换行与空格。
- 元素命名规范(元素[标签]的名称能够包括字母、数字、减号、下划线和英文句点):
- 严格区分大写和小写:
<P> <p>
- 仅仅能以字母或下划线开头: abc _abc
- 不能以xml(或XML、Xml等)开头—W3C保留日后使用;
- 名称字符之间不能有空格或制表符;
- 名称字符之间不能使用冒号;(有特殊用途)
- 严格区分大写和小写:
特殊字符
- 对于一些特殊字符,若要在元素主体内容中显示,必须进行转移。
- & –>
&
- < –>
<
- > –>
>
- ” –>
"
- ’ –>
'
- & –>
凝视
- 凝视:
<!-- 这是凝视信息 -->
- 凝视不能加在文档声明之前。
处理指令
- 处理指令。简称PI(Processing Instruction)。
- 作用:用来指挥软件怎样解析XML文档。
- 语法:必须以”
XML约束之DTD
为什么须要约束
- XML都是用户自己定义的标签,若出现小小的错误,软件程序将不能正确地获取稳健中的内容而报错。
- XML技术中。能够编写一个文档来约束一个XML的书写规范,这个文档称之为约束。
- 两个概念:
- 格式良好的XML:遵循XML语法的XML
- 有效的XML:遵循约束文档的XML
约束文档定义了在XML中同意出现的元素名称。属性及元素出现的顺序等等。
常见的约束技术
- XML DTD [*]
- XDR
- SOX
- XML Schema [*]
DTD高速入门
- DTD(Document Type Definition):文档类型定义。
- 作用:约束XML的书写规范
编写DTD的方式
- DTD约束文档能够再XML文档中直接定义。也能够作为单独的文档进行编写(单独的文档必须以UTF-8编码进行保存)。
- 在XML文档中编写DTD演示样例:
<?xml version="1.0" encoding="GBK" standalone="yes"?>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]
>
<书架>
<书>
<书名>JavaWEB开发</书名>
<作者>小三</作者>
<售价>45.90</售价>
</书>
</书架>
- 引入外部DTD文档(XML使用DOCTYPE声明语句来指明它所遵循的DTD文档,有两种方式:)
- 当引用的DTD文档在本地时。採用例如以下方式:
<!DOCTYPE 根元素 SYSTEM "DTD文档路径">
如:<!DOCTYPE 书架 SYSTEM "book.dtd">
- 当引用的DTD文档在公共网络上时。採用例如以下的方式:
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
如:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun/com/dtd/web-app_2_3.dtd">
- 举例:在XML中引用book.dtd文件演示样例
- book.dtd文件
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
- book.xml文件引用book.dtd文件
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>JavaWEB开发</书名>
<作者>小三</作者>
<售价>45.90</售价>
</书>
<书>
<书名>C/C++开发</书名>
<作者>小四</作者>
<售价>43.00</售价>
</书>
</书架>
DTD语法细节
- DTD文档的语法主要涉及下面内容的定义
- 定义元素
- 定义属性
- 定义实体
DTD-定义元素
- 在DTD文档中使用ELEMENT关键字来声明一个XML元素
- 语法:
DTD-定义属性 ###
- 在DTD文档中使用ATTLIST关键字来为一个元素声明属性。
- 语法:
<!ATTLIST 元素名
属性名1 属性值类型 设置说明
属性名2 属性值类型 设置说明
......
>
演示样例:
<!ATTLIST 商品
类别 CDATA #REQUIRED
颜色 CDATA #IMPLIED
>
则相应的XML为:<商品 类别=”服装” 颜色=”黄色”/>
- 属性值类型:
- CDATA:表示属性的取值为普通的文本字符串
- ENUMERATED(DTD没有此关键字):表示枚举,仅仅能从枚举列表中任选其一。如(鸡肉|牛肉|猪肉|鱼肉)
- ID:表示属性的取值不能反复,唯一性
- 设置说明
- #REQUIRED:表示属性必须出现
- #IMPLIED:表示该属性可有可无
- #FIXED:表示属性的取值为一个固定值。语法:#FIXED “固定值”
- 直接值:表示属性的取值为该默认值
演示样例一:
<!ATTLIST 页面作者
姓名 CDATA #IMPLIED
年龄 CDATA #IMPLIED
联系信息 CDATA #REQUIRED
站点职务 CDATA #FIXED "页面作者"
个人爱好 CDATA "上网"
>
演示样例二:
<?xml version="1.0" encoding="GBK" standalone="yes"?>
<!DOCTYPE 购物篮 [
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品种 (鸡肉|牛肉|猪肉|鱼肉) "鸡肉">
]>
<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉/>
</购物篮>
DTD-定义实体
- 定义实体就是为一段内容指定一个名称。使用时通过这个名称就能够引用其所代表的内容。
- 在DTD文档中使用ENTITY关键字来声明一个实体。
- 实体课分为:引用实体和參数实体。两者的语法不通。
定义引用实体
- 概念:在DTD中定义,在XML中使用
- 语法:
DTD中定义:
<!ENTITY copyright "易则版权全部">
XML中引用:
©right;
定义參数实体
- 概念:在DTD中定义,在DTD中使用
- 语法:
DTD中定义:
<!ENTITY % TAG_NAMES "姓名|EMAIL|电话|地址">
DTD中引用:
<!ELEMENT 个人信息 (%TAG_NAMES;|生日)>
<!ELEMENT 客户信息 (%TAG_NAMES;|公司名)>
解析XML文档
Java 解析XML概述
- XML解析方式分为两种:DOM方式和SAX方式
- DOM:Document Object Model,文档对象模型。
这样的方式是W3C推荐的处理XML的一种方式。
- SAX:Simple API for XML,这样的方式不是官方标准,属于开源社区的XML-DEV。差点儿全部的XML解析器都支持它。
- DOM:Document Object Model,文档对象模型。
- XML解析开发包
- JAXP:是SUN公司推出的解析标准实现,JDK。 *
- Dom4J:是开源组织推出的解析开发包。(大家都在使用)*
- JDom:是开源组织推出的解析开发包。
JAXP
- JAXP(Java API for XML Processing)开发包是JavaSE的一部分,它是由几个包及其自爆组成:
- org.w3c.dom:提供DOM方式解析XML的标准接口
- org.xml.dom:提供SAX方式解析XML的标准接口
- javax.xml:提供了解析XML文档的类
- javax.xml.parsers包中,定义了几个工厂类。能够通过调用这些工厂类,得到对XML文档进行解析的DOM和SAX解析器对象。
- DocumentBuilderFactory
- SAXParserFactory
注:
- DOM缺点:一次性将文档载入到内存中,假设xml文档比較大。占用的内存就会多(64M–Java)。
- Document代表内存中的整个DOM树。
- 长处:查找、改动、删除
JAXP操作文档两点注意点
- 获取Document对象
- javax.xml.parsers包中的DocumentBuilderFactory用于创建DOM模式的解析器对象,DocumentBuilderFactory是一个抽象工厂类,他不能直接实例化,单该类提供了一个newInstance方法。这种方法会依据本地平台默认安装的解析器,自己主动创建一个工厂的对象并返回。
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
- 更新XML文档(在程序中操作更新的是在内存中,XML文档在磁盘中并没有更新)
- javax.xml.transform包中的Transformer类用于把代表XML文件的Doucment对象转换为某种格式后进行输出。比如把xml文件应用样式表后转成html文档。利用这个对象,当然也能够把Document对象又又一次写入到一个XML文件里。
- Transformer类通过transform方法完毕转换操作,该方法接受一个源和一个目的地。
我们能够通过:
- javax.xml.transform.dom.DoMSource类来关联要转换的document对象。
- 用javax.xml.transform.stream.StreamResult对象来表示数据的目的地。
- Transformer对象通过TransformerFactory获得。
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/book.xml"));
SAX
- 在使用DOM解析XML文档时。须要读取整个XML文档。在内存中构架代表整个DOM书的Document对象,从而在对XML文档进行操作。此种情况下,假设XML文档特别大。就会消耗计算机的大量内存,而且easy导致内存溢出。
- SAX解析同意在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。
- SAX採用时间处理的方式解析XML文件。利用SAX解析XML文档。设计两个部分:解析器和事件处理器:
- 解析器能够使用JAXP的API创建,创建出SAX解析器后。就能够指定解析器去解析某个XML文档。
- 解析器採用SAX方式在解析某个XML文档时。它仅仅要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法。解析器在调用事件处理器的方法时。会把当前解析到的xml文件内容作为方法的參数传递给事件处理器。
- 事件处理器由程序猿编写,程序猿通过事件处理器中方法的參数。就能够非常轻松地得到sax解析器解析到的数据,从而决定怎样对数据进行处理。
- 演示样例
public static void main(String[] args) throws Exception {
// 获取解析器
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
// 得到读取器
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setContentHandler(new DefaultHandler() {
int index = 0; //售价索引
boolean isPrice = false; //是否是售价
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ("售价".equals(qName)) {
isPrice = true;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (index == 1 && isPrice) {
System.out.println(new String(ch, start, length));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("售价".equals(qName)) {
isPrice = false;
index++;
}
}
});
xmlReader.parse("sax/src/book.xml");
}
DOM4J解析XML文档
- Dom4j是一个简单、灵活的开放源码的库。Dom4j是由早起开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,单它提供了比JDOM更好的灵活性。
- Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。如今非常多软件採用的Dom4j,比如Hibernate、包括sun公司自己的JAXM也用了Dom4j。
- 使用Dom4j开发。许下载Dom4j相应的jar文件。
- 參考Dom4j-1.6.1 API文档
- 演示样例
public void getNodeTextContent() throws Exception {
//1 得到解析器
SAXReader saxReader = new SAXReader();
//2 载入xml文档
Document document = saxReader.read("src/book.xml");
//3 获取根元素
Element root = document.getRootElement();
//4 得到第二本书元素
Element book = (Element) root.elements("书").get(1);
Element bookName = book.element("书名");
Assert.assertEquals("C/C++开发", bookName.getText());
}
XML约束之Schema
- XML Schema也是一种用于定义和描写叙述XML文档与内容的模式语言,其出现时为了克服DTD的局限性。
- XML Schema本身就是一个XML文档。
- XML Schema VS DTD:
- XML Schema符合XML语法结构。
- DOM、SAX等XML API非常easy解析出XML Schema文档中内容。
- XML Schema对名称空间支持得非常好。
- XML Schema比XML DTD支持很多其它的数据类型,并支持用户自己定义新的数据类型。
- XML Schema定义约束的能力非常大。能够对XML实例文档作出仔细的语义限制。
- XML Schema不能像DTD一样定义实体。比DTD更复杂,但XML Schema如今是W3C的标准。它正在逐步代替DTD。
XML Schema高速入门
- XML Schema文件自身就是一个XML文件,但它的扩展名通常为.xsd。
- 一个XML Schema文档通常称之为模式文档(约束文档)。遵循这个文档书写的xml文件称之为实例文档。
- 和XML文件一样。一个XML Schema文档也必须有一个根节点,但这个根节点的名称为schema。
- 编写了一个XML Schema约束文档后,通常须要把这个文件里声明的元素绑定到一个URI地址上。在XML Schema技术中有一个专业术语描写叙述这个过程。即把XML Schema文档声明的元素绑定到一个名称空间上。以后XML文件就能够通过这个URI(即名称空间)来告诉解析引擎,xml文档编写的元素来自哪里,被谁约束。
- xsd演示样例:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.hsx.com"
elementFormDefault="qualified">
<xs:element name='书架'>
<xs:complexType>
<xs:sequence maxOccurs='unbounded'>
<xs:element name='书'>
<xs:complexType>
<xs:sequence>
<xs:element name='书名' type='xs:string' />
<xs:element name='作者' type='xs:string' />
<xs:element name='售价' type='xs:string' />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
- 相应的xml演示样例:
<?xml version="1.0" encoding="UTF-8"?>
<hsx:书架 xmlns:hsx="http:www.hsx.com"
xmlns:xi="http://www.w3.org/2001/XMLSchema-instance"
xi:schemaLocation="http://www.hsx.com book.xsd">
<hsx:书>
<hsx:书名>Java AOP</hsx:书名>
<hsx:作者>黄泽</hsx:作者>
<hsx:售价>50</hsx:售价>
</hsx:书>
</hsx:书架>
名称空间的概念
- 在XML Schema中,每一个约束模式文档都能够被赋予一个唯一的名称空间。名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。
在XML文件里书写标签时,能够通过名称空间声明(xmlns)。来声明当前编写的标签来自哪个Schema约束文档。如:
<hsx:书架 xmlns:hsx="http:www.hsx.com"
xmlns:xi="http://www.w3.org/2001/XMLSchema-instance"
xi:schemaLocation="http://www.hsx.com book.xsd">
<hsx:书>
<hsx:书名>Java AOP</hsx:书名>
<hsx:作者>黄泽</hsx:作者>
<hsx:售价>50</hsx:售价>
</hsx:书>
</hsx:书架>
- 注意:名称空间的名字语法easy让人混淆,虽然以
http://
開始。哪个URI并不指向一个包括模式定义的文件。其实,这个URL:http://www.hsx.com
根本没有指向不论什么文件。仅仅是一个分配的名字。
使用名称空间引入Schema
- 为了在一个XML文档中声明它所遵循的Schema文件的详细为止。通常须要在XML文档中的根节点中使用SchemaLocation属性来指定。比如:
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
- schemaLocation此属性有两个值。
第一个是值是须要使用的命名空间;第二个值是供命名空间使用的XML Schema的位置,两者之间用空格分隔。
- 注意:在使用schemaLocation属相时,也须要指定该属性来自哪里。
使用默认名称空间
- 基本格式:
xmlns="URI"
- 演示样例:
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns="http:www.hsx.com"
xmlns:xi="http://www.w3.org/2001/XMLSchema-instance"
xi:schemaLocation="http://www.hsx.com book.xsd">
<书>
<书名>Java AOP</书名>
<作者>黄泽</作者>
<售价>50</售价>
</书>
</书架>
使用名称空间引入多个XML Schema文档
- 演示样例:
<?xml version="1.0" encoding="gbk"?
>
<shiporder xmlns="http://www.itcast.cn"
xmlns:xi="http://www.w3.org/2001/XMLSchema-instance"
xi:schemaLocation="http://www.itcast.cn shiporder.xsd" orderid="aaaa">
<orderperson>aaa</orderperson>
<shipto>
<name>zhangsan</name>
<address>sd</address>
<city>jn</city>
<country>cn</country>
</shipto>
<item>
<title>aaaaa</title>
<note>bbbb</note>
<quantity>10</quantity>
<price>100.0</price>
</item>
</shiporder>
不使用名称空间引入XML Schema文档
- noNamespaceSchemaLocation
- 演示样例:
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="book.xsd">
<书>
<书名>Java编程思想</书名>
<作者>黄泽</作者>
<售价>59.00</售价>
</书>
</书架>