您的位置:首页 > 其它

XML简单介绍

2016-04-14 21:26 337 查看

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解析器都支持它。

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文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。

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很容易解析出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:书架>


注意:名称空间的名字语法容易让人混淆,尽管以
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"[/code] 
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</售价>
</书>
</书架>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: