收藏 分享(赏)

第十章 java与xml.ppt

上传人:无敌 文档编号:813499 上传时间:2018-04-26 格式:PPT 页数:38 大小:477.50KB
下载 相关 举报
第十章 java与xml.ppt_第1页
第1页 / 共38页
第十章 java与xml.ppt_第2页
第2页 / 共38页
第十章 java与xml.ppt_第3页
第3页 / 共38页
第十章 java与xml.ppt_第4页
第4页 / 共38页
第十章 java与xml.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、第十章 Java与XML,一、XML简介二、XML基础三、使用JAXP进行SAX编程 四、使用JAXP进行DOM编程,一、XML简介,Java为编程提供了一种平台无关的程序设计语言,从而导致了一场编程的革命。而XML为数据交换提供了一种平台无关的语言,使得这场革命更进一步。正如Java带来了一种完全可移植的编程语言,XML带来一种完全可移植的数据格式。实际上正是因为有了XML, Java创造者们的宏伟目标才得以实现。与平台无关的语言Java加上与平台无关的数据XML,确实能够完成最为复杂且弹性最好的分布式应用。,一、XML简介,XML全称是“可扩展标记语言”(Extensible Markup

2、 Language)。它是互联网联合组织(W3C)创建的一组规范,以便于软件开发人员和内容创作者在网页上组织信息,其目的不仅在于满足不断增长的网络应用需求,同时还希望借此能够确保在通过网络进行交互合作时,具有良好的可靠性和与交互性。 XML区别于HTML的最大特点就是XML是可扩展的,即它允许用户自己定义标记,这也是它被称为可扩展标记语言的原因。XML既不是对HTML的改进,也不是HTML的替代品,它是一种完全面向数据语义的标记语言,取消了HTML的显示样式与布局描述能力,突出了数据的语义与元素结构描述能力。,一、XML简介,XML特点可归纳为: (1)XML是元语言。元语言是描述其它语言的语

3、言,本身可以创建一种语言,可以用来创建自己的标记。 (2)允许通过使用自定义格式,标识、交换和处理数据库可以理解的数据。 (3)基于文本的格式,允许开发人员描述结构化数据并在各种应用程序之间发送和交换这些数据。 (4)有助于在服务器之间传输结构化数据,一、XML简介,XML的应用可分为四类 (1)数据交换。数据可能来自不同的数据库,都有各自不同的复杂格式,但客户与这些数据库间只通过一种标准语言进行交互,由于XML的自定义性及可扩展性,它足以表达各种类型的数据。 (2)Web服务。Web服务是服务是令人激动的革命之一,它能让使用不同系统和不同编程语言的人们能够相互交流和分享数据,其基础在于Web

4、服务器用XML在系统之间交换数据。 (3)内容管理。XML用元素和属性来描述数据,而不提供数据的显示方法。这样XML就提供了优秀的方法来标记独立于平台和语言的内容。 (4)Web集成。可以直接处理XML数据,而无需向服务器请求,因此可满足网络代理对获得的信息进行编辑、增减以适应个人用户的需要,如有些客户取得数据并不是为了直接使用而是为了根据需要组织自己的数据库。,二、XML基础,1. 处理指令 处理指令与XML文档中的其他数据是有区别的。处理指令是用来给处理XML文档的应用程序提供信息的,XML分析器把这些信息原封不动地传给应用程序,由应用程序来解释这个指令,遵照它所提供的信息进行处理。虽然它

5、在XML文本中所占的比例很小,但却有举足轻重的份量。处理指令应该遵循下面的格式: ,该指令指明了XML的版本。XML中使用的处理指令只能是解释器可识别的XML标准处理命令集中的一部分,处理指令也可以被应用程序用来传递信息,这些信息可以用来帮助进行解析。,二、XML基础,2. 名字空间 因为XML中标识都是自己创建的,在不同的DTD文件中,标识名可能相同但表示的含义不同,这就可能引起数据混乱。比如在一个文档mytable中table标签表示桌子,而在另一个文档mylist中table标签表示表格。如果需要同时处理这两个文档,就会发生名字冲突。名字空间(namespace)就是为解决这一问题而引进

6、的,名字空间是一个元素前缀与URL之间的一种映射关系。 这个映射可以用来处理标签名字的冲突,定义可以允许解析器处理冲突的数据结构。,二、XML基础,3. 标签属性 在一个标签中除了包含的数据外,还可以有自己的属性。属性和它们的值可包含在该 标签的打开声明中,也可以包含在关闭声明中。其一般形式如下: 4. DTD DTD(Document Type Definition)是一套关于标记符的语法规则,规定可以在文档中使用哪些标记符,应该按什么次序出现,哪些标记符可以出现于其他标记符中,哪些标记符有属性等等。,二、XML基础,5. 样式表 在XML文件中,使用的基本上是自定义的标记,显然一个浏览器是

7、无法理解这些标记的,现在浏览器仅仅是作为一个XML文件的解析器只要XML文件是正确的,那么它就将文件原封不动地显示出来。 如果想控制XML文档如何显示,则需要为它编写一个样式表。样式表是用来规定XML文档的显示方式的。可以使用CSS(级联样式表)或XSL(可扩展样式表语言)来编写样式表。 CSS决定了页面的视觉外观,它告诉浏览器怎样显示XML文档中地每个元素,但是不会改变源文档的结构。而XSL是用来处理文档的标记语言,也称为基于模板的语言,它允许将某种模式映射到源文档中,该源文档的输出是用XML、HTML或纯文本书写的。使用XSL,可以将XML文档的结构转换为不同的XML文档。,二、XML基础

8、,6. DOM DOM的全名是文档对象模型(Document Object Model)。DOM是由W3C在1998年10月1日发布的标准,它最开始的目的是为了建立一套标准来定义建立在微软和网景经验之上的文档对象模块,它实际上是定义了文档的逻辑结构以及对文件进行访问和操作的方法。 DOM将一个XML文档看成是一棵节点树,每一个节点代表一个可以和它交互的对象,可以任意地存取、修改这个由XML文件所形成的DOM树。对DOM来说,每个项目都是特定形态的节点,都继承自Node接口。常见的节点有Document、Text、Element、以及Attribute等,这些节点都可以有子节点,XML文件可以构

9、成一棵完整的DOM树。,二、XML基础,虽然DOM是操作和访问XML文档非常方便的方法,但是它是有代价的,它需要在实际进行处理前对整个XML文档进行分析,而把整个XML文档转换而成的树放到内存中需要占据很大的空间。这就经常造成程序运行缓慢甚至瘫痪。文档越庞大越复杂,这种缺陷就越明显。虽然DOM是操作XML数据的一种流行方式,但它不是完成此类任务的唯一方式。可以花时间使用DOM,同时也可以通过编写代码来从SAX中直接操作数据,应用程序的要求通常决定哪种方案更适合自己特定的发展计划。,二、XML基础,7. SAX SAX的全名是XML简单API(Simple API for XML)。SAX是由一

10、个名为XML-dev的邮件列表所发展出来的,与DOM比较而言,SAX是一种轻量型的方法。在处理DOM的时候,需要读入整个的XML文档,然后在内存中创建DOM树,生成DOM树上的每个Node对象。当文档比较小的时候,这不会造成什么问题,但是一旦文档大起来,处理DOM就会变得相当费时费力。特别是其对于内存的需求,也将是成倍的增长,以至于在某些应用中使用DOM是一件很不划算的事(比如在applet中)。这时候,一个较好的替代解决方法就是SAX。,二、XML基础,SAX提供了一个用来解析XML数据的基于事件的框架,它扫描整个XML文档,并将数据拆解成几个有用的部分。SAX定义了解析XML文档时会发生的

11、许多事件,例如element开始、element结束、出现字符数据等。事件发生时,SAX会调用相应的回调方法。程序员可以自行定义这些回调方法的内容,以对此事件做出适当的反应,并允许程序使用这些XML的资料。SAX并不要求将整个XML文件一起装入内存。它的想法十分的简单,一旦XML处理器完成对XML元素的操作,它就立刻调用一个自定义事件处理器及时地处理这个元素和相关数据。这样做虽然能极大的提高效率,但也会造成一定的问题,比如说开发者将不得不在灵活性上受到限制。,二、XML基础,8. JAXP JAXP是SUN公司的XML解析JavaAPI(JavaAPl forXML Parsing)的简称。目

12、前很多公司都提供了自己的解析器,用户需要在这些解析器中选择一种来进行XML的开发。因而当使用DOM或SAX时,用户必须明确地导入厂商所提供的解析类。但随之而来的问题就是,如果要改变正在使用的解析类,就必须改变它的代码并重新编译,这就会引起很多不必要的麻烦。为了解决上述的问题,SUN公司开发了JAXP。利用JAXP,可以不必直接导入厂商的解析类,而通过一个系统属性来指定所要使用的解析器,然后JAXP能够读取该属性并处理所需类的加载工作。靠这种方式,要改变所需的解析器只需要重新设置解析类的系统属性就可以了,程序员不用再为不同厂商的不同版本大伤脑筋。,二、XML基础,9. JDOM JDOM(Jav

13、a Document Object Model)是一种使用XML的独特Java工具包,用来提供Java程序处理XML的能力。更重要的是它还是第一个明确地针对Java程序员所设计用来处理XML的API,这意味着它符合一般Java程序员的期待、习惯和希望。JDOM并不支持DOM那样严格的树形结构,可以直接的操作某Element。 传统的处理方式可比较麻烦,首先得找到树中的Element节点的子节点,判断其是否为文字节点,然后才能取得其值。使用JDOM提供的方法可直接传出集合形态的对象,不像其他APl要用特殊的方式(比方说DOM的NamedNodeMap,SAX的Attributes),这使得JDO

14、M比DOM更直接好用。,三、使用JAXP进行SAX编程,使用SAX的时候,会经常用到JAXP的两个类SAXParser和SAXParserFactory。前者封装了一个SAX的解析器实现、而后者处理对该实现的动态加载。在SAXParser接受XML文档,读入XML文档的过程中就进行解析,也就是说读入文档的过程和解析的过程是同时进行的。解析开始之前,需要向SAXParser注册一个ContentHandler,也就是相当于一个事件监听器,在ContentHandler中定义了很多方法,例如startDocument()定制了当在解析过程中遇到文档开始时应该处理的事情。当XMLReader读到合适

15、的内容,就会抛出相应的事件,并把这个事件的处理权代理给ContentHandler,调用其相应的方法进行响应。,三、使用JAXP进行SAX编程,解析文档 在进行XML文档解析前,需要调入一个SAX解析器,JAXP中的SAXParser类封装了一个SAX的解析器实现,因此首先要做的就是创建一个SAXParser对象。SAXParser对象可以由SAXParserFactory动态的加载,下面是创建一个SAXParser对象的一般形式:SAXParserFactory spf = SAXParserFactory.newInstance();SAXParser saxParser = spf.ne

16、wSAXParser(); 这里使用了工厂模式,主要是为了使程序代码与具体的解析器无关。当一个解析器被调入并准备就绪后,就可以对XML文档进行解析了,这通常是由SAXParser类的parse来完成的。要调用parse方法,需要告诉该方法所要解析的是哪一个文件并指定一个管理器。,三、使用JAXP进行SAX编程,例SaxParseTest.javaimport javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import javax.xml.parsers.ParserConfigurationExcep

17、tion;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import java.io.File;import java.io.IOException;public class SaxParseTest public void display(String filename) SAXParserFactory spf; SAXParser saxParser; tryspf = SAXParserFactory.newInstance();saxParser = spf.newSAXParser

18、();System.out.println(正在解析XML文档:+filename);File file=new File(filename);DefaultHandler handler = new DefaultHandler();saxParser.parse(file,handler); ,三、使用JAXP进行SAX编程,catch(ParserConfigurationException e)System.out.println(e);catch(SAXException e)System.out.println(e);catch(IOException e)System.out.p

19、rintln(e); public static void main(String args) String filename = XMLTestl.xml; SaxParseTest app = new SaxParseTest(); app.display(filename); ,三、使用JAXP进行SAX编程,内容管理器 在进行解析时,为使应用程序能够有效地处理XML数据,必须为SAX解析器登记管理器。管理器是一组SAX定义的回调,它能在文档解析过程当中给重要的事件插入相应的应用程序代码。这些事件是与文档解析同时进行的,而不是解析过程完成后再进行。 在SAX 2.0中定义了四个核心的管理

20、器接口,它们分别是:org.xml.sax.contentHandler、org.xml.sax.DTDHandler、Org.xml.sax.EntityResolve和Org.xml.sax.ErrorHandler。在本书中只介绍contentHandler接口的使用。ContentHandler接口定义了处理XML文档内容的应用程序的回调方法。,三、使用JAXP进行SAX编程,四、使用JAXP进行DOM编程,DOM不同于SAX,它是由W3C所发布的标准。SAX是一种公有的标准,是通过长期在邮件列表XML-dev中的讨论而发展起来的,而DOM实际上更像是一种与XML规范类似的标准。DOM

21、将一个XML文档看成是一棵节点树,在进行解析时它需要读入整个的XML文档,然后在内存中创建DOM树,生成DOM树上的每个Node对象。通过对这些节点进行操作,可以实现对XML文件的存取和修改。,四、使用JAXP进行DOM编程,解析文档 与SAX编程类似,在对XML文件进行解析前,也需要先载入一个DOM解析器。使用JAXP来获取DOM解析器的基本原理与获取SAX解析器的原理是一样的。 javax.xml.parsers包中的两个类DocumentBuilder和DocumentBuilderPactory对应于SAX的SAXParser类和SAXParserFactory类。,四、使用JAXP进

22、行DOM编程,例 DOMParseTest.javaimport javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.xml.sax.SAXException;import org.w3c.dom.Document;import java.io.IOException;import java.io.File;public class DOMParseTes

23、t void display(String filename) DocumentBuilderFactory factory; DocumentBuilder parser; try factory = DocumentBuilderFactory.newInstance(); parser = factory.newDocumentBuilder(); File file = new File(filename); System.out.println(正在解析XML文件+filename); Document doc = parser.parse(file); ,四、使用JAXP进行DOM

24、编程,catch(ParserConfigurationException e) System.out.println(e); catch(SAXException e) System.out.println(e); catch(IOException e) System.out.println(e); public static void main(String args) DOMParseTest app = new DOMParseTest(); app.display(XMLTest1.xml); ,四、使用JAXP进行DOM编程,基本的DOM类 1. Document类 Docume

25、nt类代表了经过DOM解析器解析后所得到的DOM树,通俗地说就是整个的XML文档,所有其他的节点,都以一定的顺序包含在Document对象中,排列成一个树形的结构,程序员可以通过遍历这颗树来得到XML文档的所有的内容,这也是对XML文档操作的起点。一般都是先通过解析XML源文件而得到一个Document对象,然后再来执行后续的操作。,四、使用JAXP进行DOM编程,2. Node类 Node类是DOM结构中最为基本的类,一个Node类型的对象代表了文档树中的一个抽象的节点。实际使用时很少会真正的用到Node这个类,而是用Element、Attr、Text等Node类的子类来操作文档。,四、使用

26、JAXP进行DOM编程,3. NodeList类 NodeList类代表了一个包含了一个或者多个Node类的列表。可以简单的把它看成一个Node类的数组。,四、使用JAXP进行DOM编程,4. Element类 Element类代表的是XML文档中的标签元素,它继承自Node类,亦是Node类的最主要的子类。在标签中可以包含有属性,因而Element对象中有存取其属性的方法,而任何Node类中定义的方法,也可以用在Element类上。,四、使用JAXP进行DOM编程,5. Attr类 Attr类代表了某个标签中的属性。Attr类继承于Node类,但是因为属性实际上是包含在标签中的,它并不能被看

27、作是Element的子节点,因而在DOM中Attr类并不是DOM树的部分,所以Node中的getparentNode(),getpreviousSibling()和getnextSibling()返回的都将是null。Attr其实是被看作包含它的Element的一部分,它并不作为DOM树中单独的一个节点出现,这一点在使用的时候要同其他的Node子类相区别。,四、使用JAXP进行DOM编程,存取数据 DOM将一个XML文档看成是一棵节点树,通俗地说,就是通过解析XML文档,为XML文档在逻辑上建立一个树模型,通过存取这些对象就能够存取XML文档的内容。因而,要存取XML文档中的数据,需要先获取这

28、些节点对象。通过调用Document类的Set ElementsByTagName方法可以获取标签列表。下面将通过一个实例来进行讲解。例 DOMNodeTest.javaimport javax.xml.parsers.*;import org.xml.sax.SAXException;import org.w3c.dom.*;import java.io.IOException;import java.io.File;,四、使用JAXP进行DOM编程,public class DOMNodeTestvoid display(String filename) DocumentBuilderFa

29、ctory factory; DocumentBuilder parser; Element book,title,author,press, pages,price; try factory = DocumentBuilderFactory.newInstance(); parser=factory.newDocumentBuilder(); File file = new File(filename); Document doc = parser.parse(file); NodeList books = doc.getElementsByTagName(JAVAXML:BOOK); fo

30、r(int i=0;ibooks.getLength();i+)book = (Element)books.item(i); title=(Element)book.getElementsByTagName(JAVAXML:TITLE).item(0); author=(Element)book.getElementsByTagName(JAVAXML:AUTHOR).item(0);press=(Element)book.getElementsByTagName(JAVAXML:PRESS).item(0);,四、使用JAXP进行DOM编程,pages=(Element)book.getEl

31、ementsByTagName(JAVAXML:PAGES).item(0); price=(Element)book.getElementsByTagName(JAVAXML:PRICE).item(0);String value;value=title.getFirstChild().getNodeValue();System.out.println(+value+);value=author.getFirstChild().getNodeValue();System.out.println(作者:+value);value=press.getFirstChild().getNodeVal

32、ue();System.out.println(出版社:+value);value=pages.getFirstChild().getNodeValue();System.out.println(页数:+value);value=price.getFirstChild().getNodeValue();System.out.println(定价:+value);value=book.getAttribute(SALEROOM);System.out.println(销量:+value+rn); catch(ParserConfigurationException e) System.out.p

33、rintln(e); catch(SAXException e) System.out.println(e); catch(IOException e) System.out.println(e); public static void main(String args) DOMNodeTest app = new DOMNodeTest(); app.display(XMLTest5.xml); ,四、使用JAXP进行DOM编程,修改文件 在JAXPl.0版本中,并没有直接的类和方法能够处理XML文档的写入问题,需要借助其他包中的一些辅助类。而在JAXPl.1版本中,引入了对XSLT的支持。

34、所谓XSLT就是对XML文档进行变换后,得到一个新的文档结构。利用这个新加入的功能,就能够很方便的把新生成或者修改后的DOM树重新写回到XML文件中去了,这需要用到java.xml.transform包中的几个类。这里所要做的就是要创建新的节点并添加到DOM树中去,然后用XSLT把DOM树输出。下面例子是希望向DOM树中添加一个JAVAXML:BOOK标签并为其设置属性和添加子标签,最终将修改后的DOM树写回到XML文档里去。,四、使用JAXP进行DOM编程,例 DOMAppendTest.javaimport javax.xml.parsers.*;import javax.xml.tran

35、sform.*;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.xml.sax.SAXException;import org.w3c.dom.*;import java.io.IOException;import java.io.File;public class DOMAppendTest void display(String filename) DocumentBuilderFactory factory; DocumentBuilder

36、 parser; Element book,title,author,press, pages,price; try factory = DocumentBuilderFactory.newInstance();parser=factory.newDocumentBuilder();File file = new File(filename);Document doc = parser.parse(file);Text text;book = doc.createElement(JAVAXML:BOOK);,四、使用JAXP进行DOM编程,title=doc.createElement(JAV

37、AXML:TITIE);text=doc.createTextNode(操作系统);title.appendChild(text);book.appendChild(title);author=doc.createElement(JAVAXML:AUTHOR);text=doc.createTextNode(孙七);author.appendChild(text); book.appendChild(author);press=doc.createElement(JAVAXML:PRESS);text=doc.createTextNode(北京大学出版社);press.appendChild(

38、text); book.appendChild(press);pages=doc.createElement(JAVAXML:PAGES);text=doc.createTextNode(450);pages.appendChild(text); book.appendChild(pages);price=doc.createElement(JAVAXML:PRICE);text=doc.createTextNode(¥50);price.appendChild(text);book.appendChild(price);Attr attr = doc.createAttribute(SALE

39、ROOM);text=doc.createTextNode(105);attr.appendChild(text);book.setAttributeNode(attr);,四、使用JAXP进行DOM编程,doc.getDocumentElement().appendChild(book);TransformerFactory tFactory = TransformerFactory.newInstance();Transformer transformer = tFactory.newTransformer();DOMSource source = new DOMSource(doc);S

40、treamResult result = new StreamResult(new File(filename);transformer.transform(source,result); catch(ParserConfigurationException e) System.out.println(e); catch(SAXException e) System.out.println(e); catch(TransformerConfigurationException e) System.out.println(e); catch(TransformerException e) Sys

41、tem.out.println(e); catch(IOException e) System.out.println(e); public static void main(String args)DOMAppendTest app = new DOMAppendTest();app.display(XMLTest5.xml);,小结,XML是一种描述数据和数据结构的语言,可以保存在任何可以存储文本的文件中,XML具有自描述性、内容和显示分离、可扩展、独立于平台等特点。XML解析器是XML和应用程序之间存在的软件单元,主要起桥梁作用,为应用程序从XML中提取所需要的数据。Java中对XML文档的处理方式有两种,一是基于事件的SAX处理方式,二是根据文档内容建立层次数据结构的DOM方式,两种方式各有利弊,具体根据实际情况选择。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报