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</售价> </书> </书架>
相关文章推荐
- SOCKET
- 为什么有些行内元素可以设置宽高
- [C语言][LeetCode][2]Add Two Numbers
- nginx-负载均衡简单配置
- Eclipse的rcp插件,在Perspective中添加ViewPart无效
- 20160414交易记录
- git_ABC
- 兴趣问题清单
- codeforces Longest k-Good Segment 616D
- Android 设置wap请求方式
- HDU 1907 ACM博弈论入门:尼姆博奕
- Web语义化的理解
- FusionCharts简单教程(一)---建立第一个FusionCharts图形
- Redis - 持久化
- TPLINK无线路由器怎么设置_怎么查连到当前路由器的设备的MAC地址
- 隔行变色
- 使用 pod install 还是 pod update ?
- BZOJ 3123 SDOI2013 森林
- OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己
- 0414复利计算5.1-美观、输入更新