二、Java XML 教程
1、Java XML 解析器
1.1、什么是XML解析?
解析XML是指将通过XML文档访问数据或修改数据的一个操作或方法。
Java库中提供了两种XML解析器: 1、像文档对象模型(Document Object Model,DOM)解析器这的树型解析器(tree parse),它们将读入的XML文档转换 成树结构。 2、像XML简单API(Simple API for XML,SAX)解析器这样的流机制解析器(streaming parser),它们在读入XML文档时生 成相应的事件。
1.2、XML解析器是什么?
XML解析器提供方法来访问或修改XML文档中的数据。 Java提供了多种选择来解析XML文档。以下是各种类型解析器其通常用于解析XML文档。 Dom解析器 - 解析通过加载该文件的全部内容,并创建其完整分级树中存储的文件。 SAX解析器 - 解析基于事件触发器的文档。不完整(部分)的文件加载到存储器中。 JDOM解析器 - 解析以类似的方式,以DOM解析器但更简单的方法的文档。 StAX解析器 - 解析以类似的方式,以SAX解析器但在更高效的方式的文档。 XPath解析器 - 解析基于表达式XML并广泛选择使用XSLT。 DOM4J解析器 - Java库来解析XML,XPath和使用Java集合框架XSLT,为DOM,SAX和JAXP的支持。
2、Java DOM解析器
2.1、DOM解析器简介
文档对象模型是万维网联盟(W3C)的官方推荐。它定义了一个接口,使程序能够访问和更新样式,结构和XML文档的内容。支持DOM实现该接口的XML解析器。
何时使用? 在以下几种情况时,应该使用DOM解析器: 1、需要知道很多关于文档的结构 2、需要将文档的部分周围(例如,可能需要某些元素进行排序) 3、需要使用的文件中的信息超过一次
会得到什么? 当使用DOM 解析器解析一个XML文档,会得到一个树形结构,其中包含的所有文档的元素。 DOM提供了多种可用于检查文档的内容和结构的函数。
优势 DOM是用于处理文档结构的通用接口。它的一个设计目标是Java代码编写一个DOM兼容的解析器,运行在任何其他的DOM兼容的解析器不会有变化。
DOM接口 DOM定义了几个Java接口。这里是最常见的接口: 1、节点 - DOM的基本数据类型。 2、元素 - 要处理的对象绝大多数是元素。 3、Attr - 代表元素的属性。 4、文本 - 元素或Attr的实际内容。 5、文档 - 代表整个XML文档。文档对象是通常被称为DOM树。
常见的DOM方法 当正在使用DOM,有经常用到的几种方法: 1、Document.getDocumentElement() - 返回文档的根元素。 2、Node.getFirstChild() - 返回给定节点的第一个子节点。 3、Node.getLastChild() - 返回给定节点的最后一个子节点。 4、Node.getNextSibling() - 这些方法返回一个特定节点的下一个兄弟节点。 5、Node.getPreviousSibling() - 这些方法返回一个特定节点的前一个兄弟节点。 6、Node.getAttribute(attrName) - 对于给定的节点,则返回所请求的名字的属性。
2.2、Java DOM解析器 - 解析XML文档
使用DOM的步骤 以下是在使用DOM解析器解析文档使用的步骤。 1、导入XML相关的软件包。 2、创建DocumentBuilder 3、从文件或流创建一个文档 4、提取根元素 5、检查属性 6、检查子元素
document对象: 要操作XML,先就得有Document对象,把一个XML文件加载进内存的时候,在内存中形成所谓的一种树状结构,我们把这一个结构称之为DOM树.
注意: 我们在Java代码中所做的增/删/改/查操作,都仅仅是操作的是内存中的Document对象,和磁盘中的XML文件没有关系。比如:删除一个联系人信息之后,XML文件中数据依然存在,此时出现内存中的数据和磁盘文件中的数据不同步。所以,对于增删改操作,我们需要做同步操作(把内存中的数据和磁盘的XML文件数据保持一致)。 DOM:在第一次的时候就会把XML文件加载进内存,如果XML文件过大,可能会造成内存的溢出. DOM:在做增删改查操作的时候比较简单,,但是性能却不高(线性搜索).
3、Java SAX解析器
3.1、Java SAX解析器简介
SAX解析器在解析XML输入数据的各个组成部分时会报告事件,但不会以任何方式存储文档,而是由事件处理器建立相应的数据结构。实际上DOM解析器是在SAX解析器的基础上构建的,它在接收到解析器事件时构建DOM树。
SAX(针对XML的简单API)是基于事件为XML文档的解析器。不像DOM解析器,SAX解析器创建没有解析树。 SAX是一个流接口用于XML的,这意味着使用SAX应用接收事件通知有关XML文档被处理的元素,属性,在按顺序每次开始在文档的顶部,并与所述闭合结束根元素。 1、读取XML文件从上到下,构成一个结构完整的XML文档的标记 2、令牌以相同的顺序进行处理,它们出现在文档中 3、报告应用程序,因为它们所出现解析器遇到标记的特性 4、应用程序提供了必须的解析器注册的“事件”处理程序 5、作为标记标识,在处理程序回调方法相关信息调用
什么时候使用? 应该使用SAX解析器的时候: 1、可以在XML文档从上往下处理以线性方式 2、该文件并不深层次嵌套 3、处理一个非常大的XML文档,DOM树会占用太多的内存。典型DOM的实现使用10字节的存储器以表示XML的一个字节 4、解决的问题涉及的XML文档的一部分 5、数据是可用的,只要它是由解析器看出,这样的SAX可以很好地用于到达流的XML文档
SAX的缺点 1、它是在一个只进入处理随机访问方式XML文档 2、如果需要跟踪的数据分析器已经看到或更改项目的顺序,必须自已编写代码和数据存储
ContentHandler接口 此接口指定SAX解析器用来通知XML文档,已经看到部件应用程序的回调方法。
方法 方法描述
void startDocument() 调用在一个文件的开头。
void endDocument() 调用在一个文件的末尾。
void startElement(String uri, String localName, String qName, Attributes atts) 调用在一个元素的开头
void endElement(String uri, String localName,String qName) 调用在一个元件的末端。
void characters(char[] ch, int start, int length) 字符数据出现时调用。
void ignorableWhitespace( char[] ch, int start, int length) 当DTD是当前和忽略空白遇到时调用。
void processingInstruction(String target, String data) 当处理指令的认可时调用。
void setDocumentLocator(Locator locator)) 提供可用于识别文档中的位置的定位器。
void skippedEntity(String name) 一个尚未解决实体遇到时调用。
void startPrefixMapping(String prefix, String uri) 当一个新的命名空间的映射定义调用。
void endPrefixMapping(String prefix)
当一个命名空间定义结束其范围时调用。
属性接口 这种接口指定用于处理连接到一个元素的属性的方法。 int getLength() - 返回属性的数目。 String getQName(int index) String getValue(int index) String getValue(String qname)
3.2、Java SAX解析器 - 解析XML文档
在使用SAX解析器时,需要一个处理器来为各种解析器事件定义事件动作。DefaultHandler接口定义了若干个在解析文档时解析器会调用的回调方法。下面是最重要的几个方法:
1、startElement和endElement在每当遇到起始或终止标签时调用。
2、characters在每当遇到字符数据时调用。
3、startDocument和endDocument分别在文档开始和结束时各调用一次。
解析器会产生以下回调: 1)startElement,元素名:person 2)startElement,元素名:name ,属性:type="string" 3)characters,内容:韩信 4)endElement,元素名:name 5)startElement,元素名:age 6)characters,内容:25 7)endElement,元素名:age 8)endElement,元素名:person
处理器必须覆盖这些方法,让它们执行在解析文件时我们想让它们执行的动作。下面通过一个简单的demo体会SAX解析XML的过程。
4、Java StAX解析器
4.1、Java StAX解析器简介
StAX即Streaming API for XML,当前最有效的XML处理方法,因此特别适合于处理复杂流程,比如数据库绑定和SOAP消息。StAX创建的信息集是非常小,可以直接作为垃圾收集的候选对象。这让XML处理任务占用较小的空间,使得它不仅适用于小型堆设备,比如移动电话,而且适用于长期运行的服务器端应用程序。 与SAX不同,StAX能够对XML文档进行写操作,这减少了需要处理的API数量。 StAX提供两种不同的解析数据模型:光标模型和迭代器模型。
环境设置 为了使用StAX的解析器,应该准备好stax.jar在应用程序的类路径中。下载 stax-1.2.0.jar,以下是StAX API的功能: 1、读取XML文件从上到下,认识构成一个结构完整的XML文档的标记 2、令牌是以相同的顺序进行处理,它们出现在文档中 3、报告应用程序,因为解析器遇到标记的特性 4、应用程序提供了一个“事件”读取器充当了事件,以获得所需信息的迭代器和迭代。可另一个读取器是“光标”充当一个指向XML 节点。 5、由于事件被识别,XML元素可以从事件对象进行检索,并且可以进一步处理。
什么情况下使用?
应该使用的StAX解析器的时候: 1、可以处理在自上而下线性方式的XML文档。 2、文件并不深入嵌套。 3、处理一个非常大的XML文档的DOM树会占用太多的内存。典型的DOM的实现使用10字节的存储器以表示XML的一个字节。 4、要解决的问题涉及XML文档的一部分。 5、数据是可用的,只要它是由解析器处理,这样StAX可以很好地用于所收到超过数据流的XML文档。
SAX的缺点
1、因为它是在一个处理的方式,而不是随机访问XML文档。 2、如果需要跟踪的数据分析器已经看到或更改项目的顺序,必须编写代码和数据存储以自己方式处理。
XMLEventReader类
因为在解析XML文档时该类提供可用于迭代事件事件迭代器 1、StartElement asStartElement() - 用于检索值和元素的属性。 2、EndElement asEndElement() - 调用元件的端部。 3、Characters asCharacters() - 可用于获得字符,例如一个CDATA,空白等。
XMLEventWriter类
此接口指定创建事件的方法。 add(Event event) - 添加包含元素XML事件。
XMLStreamReader Class
因为在解析XML文档时该类提供可用于迭代事件事件迭代器 1、int next() - 用于检索下一个事件。 2、boolean hasNext() - 用于检查其他事件的存在与否 3、String getText() - 用于获取一个元素的文本 4、String getLocalName() - 用于获取一个元素的名称
XMLStreamWriter类
此接口指定创建事件的方法 1、writeStartElement(String localName) - 加入定名称开始元素。 2、writeEndElement(String localName) - 添加指定名称的结束元素。 3、writeAttribute(String localName, String value) - 编写属性到元素。
5、Java XPath解析器
5.1、Java XPath解析器简介
XPath是万维网联盟(W3C)的官方推荐。它定义了一个语言在XML文件中查找信息。它被用于遍历XML文档的元素和属性。 XPath提供各种类型,可用于从XML文档查询相关的信息表现形式。
什么是XPath?
结构定义 - XPath定义像元素,属性,文本,命名空间,处理指令,注释和文档节点的XML文档部分 路径表达式 - XPath提供了强大的路径表达式选择的节点或在XML文档中的节点列表。 标准功能 - XPath提供了丰富的标准函数库操纵字符串值,数值,日期和时间比较,节操作,顺序操作,布尔值等。 XSLT重要组成部分 - XPath是在XSLT标准的主要元素之一,是必须有知识,以便使用XSLT的文档。 W3C推荐 - XPath是万维网联盟(W3C)的官方推荐。
XPath表达式
XPath使用路径表达式从XML文档中选择一个或多个节点的列表。以下是有用的路径和表达,从XML文档选择节点的任何节点/列表清单。
表达式 描述
node-name 选择具有给定名称的所有节点“nodename”
/ 选择从根节点开始
// 选择从当前节点匹配开始的选择
. 选择当前节点
.. 选择当前节点的父节点
@ 选择属性
student 例如:选择名称为“student”的所有节点
class/student 例如:选择属于类的所有学生的子类元素
//student 选择文档中所有学生的元素
路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
谓词
谓词用于查找特定的节点或一个节点含有特定的值,并使用所定义 [...] .
表达式 结果
/class/student[1] 选择的是类元素的子第一个学生的元素
/class/student[last()] 选择的是类元素的子最后一个学生的元素
/class/student[last()-1] 选择的是类元素倒数的第二个学生的子元素
//student[@rollno='493'] 选择一个名为rollno为'493'值的属性的学生元素
6、Java DOM4J解析器
6.1、Java DOM4J解析器解析
DOM4J是一个开源的,基于Java的库来解析XML文档,它具有高度的灵活性,高性能和内存效率的API。这是java的优化,使用Java集合像列表和数组。它可以使用DOM,SAX,XPath和XSLT。它解析大型XML文档时具有极低的内存占用。
环境设置 为了使用DOM4J解析器,应该 dom4j-1.6.1.jar 和 jaxen.jar 在应用程序的类路径中。下载 dom4j-1.6.1.zip.
什么情况下使用? 应该考虑使用DOM4J解析器的时候: 1、需要知道很多关于文档的结构 2、需要将文档的部分围绕(例如,可能需要某些元素进行排序) 3、需要使用的文件中的信息超过一次 4、你是一个Java开发人员,并希望利用XML的Java的优化解析。
会得到什么? 当解析一个DOM4J解析XML文档,可以灵活地得到一个树形结构,其中包含所有文档的元素,而不会影响应用程序的内存占用。DOM4J提供了多种可用于检查的情况下文档内容和结构的实用功能是良好的结构,其结构是公知的。 DOM4J使用XPath表达式来浏览XML文档。
优势 DOM4J使Java开发的灵活性和XML解析代码易于维护。它是轻量级的,快速的API。
DOM4J 类 DOM4J定义了几个Java类。以下是最常见的类:
类 说明
Document 表示整个XML文档。文档Document对象是通常被称为DOM树。
Element 表示一个XML元素。 Element对象有方法来操作其子元素,它的文本,属性和名称空间。
Attribute 表示元素的属性。属性有方法来获取和设置属性的值。它有父节点和属性类型。
Node 代表元素,属性或处理指令
常见DOM4J的方法 当使用DOM4J,还有经常用到的几种方法:
方法 方法说明
SAXReader.read(xmlSource)() 构建XML源的DOM4J文档。
Document.getRootElement() 得到的XML的根元素。
Element.node(index) 获得在元素特定索引XML节点。
Element.attributes() 获取一个元素的所有属性。
Node.valueOf(@Name) 得到元件的给定名称的属性的值。
7、总结
XML解析方式分为两种:dom和sax dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。 sax: (Simple API for XML) 不是官方标准,但它是XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。
XML解析器 Crimson、Xerces 、Aelfred2 XML解析开发包 Jaxp、Jdom、dom4j
1、DOM解析 DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。 DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。 DOM是拉模型,在遍历文档时,会把感兴趣的部分从读取器中拉出,不需要引发事件,允许我们选择性地处理节点。这大大提高了灵活性,以及整体效率。
2、DOM的基本对象有5个:Document,Node,NodeList,Element和Attr。 2.1、Document对象 代表了整个XML的文档,所有其它的Node,都以一定的顺序包含在Document对象之内,排列成一个树形的结构,程序员可以通过遍历这颗树来得到XML文档的所有的内容,这也是对XML文档操作的起点。我们总是先通过解析XML源文件而得到一个Document对象,然后再来执行后续的操作。此外,Document还包含了创建其它节点的方法,比如createAttribut()用来创建一个Attr对象。它所包含的主要的方法有: createAttribute(String):用给定的属性名创建一个Attr对象,并可在其后使用setAttributeNode方法来放置在某一个Element对 象上面。 createElement(String):用给定的标签名创建一个Element对象,代表XML文档中的一个标签,然后就可以在这个Element对象 上添加属性或进行其它的操作。 createTextNode(String):用给定的字符串创建一个Text对象,Text对象代表了标签或者属性中所包含的纯文本字符串。如果在 一个标签内没有其它的标签,那么标签内的文本所代表的Text对象是这个Element对象的唯一子对象。 getElementsByTagName(String):返回一个NodeList对象,它包含了所有给定标签名字的标签。 getDocumentElement():返回一个代表这个DOM树的根节点的Element对象,也就是代表XML文档根元素的那个对象。
2.2、Node对象 是DOM结构中最为基本的对象,代表了文档树中的一个抽象的节点。在实际使用的时候,很少会真正的用到Node这个对象,而是用到诸如Element、Attr、Text等Node对象的子对象来操作文档。Node对象为这些对象提供了一个抽象的、公共的根。虽然在Node对象中定义了对其子节点进行存取的方法,但是有一些Node子对象,比如Text对象,它并不存在子节点,这一点是要注意的。Node对象所包含的主要的方法有: appendChild(org.w3c.dom.Node):为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先 把它删掉再添加进去。 getFirstChild():如果节点存在子节点,则返回第一个子节点,对等的,还有getLastChild()方法返回最后一个子节点。 getNextSibling():返回在DOM树中这个节点的下一个兄弟节点,对等的,还有getPreviousSibling()方法返回其前一个兄弟节 点。 getNodeName():根据节点的类型返回节点的名称。 getNodeType():返回节点的类型。 getNodeValue():返回节点的值。 hasChildNodes():判断是不是存在有子节点。 hasAttributes():判断这个节点是否存在有属性。 getOwnerDocument():返回节点所处的Document对象。 insertBefore(org.w3c.dom.Node new,org.w3c.dom.Node ref):在给定的一个子对象前再插入一个子对象。 removeChild(org.w3c.dom.Node):删除给定的子节点对象。 replaceChild(org.w3c.dom.Node new,org.w3c.dom.Node old):用一个新的Node对象代替给定的子节点对象。
2.3、NodeList对象 顾名思义,就是代表了一个包含了一个或者多个Node的列表。可以简单的把它看成一个Node的数组,我们可以通过方法来获得列表中的元素: getLength():返回列表的长度。 item(int):返回指定位置的Node对象。
2.4、Element对象 代表的是XML文档中的标签元素,继承于Node,亦是Node的最主要的子对象。在标签中可以包含有属性,因而Element对象中有存取其属性的方法,而任何Node中定义的方法,也可以用在Element对象上面。 getElementsByTagName(String):返回一个NodeList对象,它包含了在这个标签中其下的子孙节点中具有给定标签名字的标 签。 getTagName():返回一个代表这个标签名字的字符串。 getAttribute(String):返回标签中给定属性名称的属性的值。在这儿需要主要的是,应为XML文档中允许*有实体属性出现,而 这个方法对这些实体属性并不适用。这时候需要用到getAttributeNodes()方法来得到一个Attr对象来进行进一步的操作。 getAttributeNode(String):返回一个代表给定属性名称的Attr对象。
2.5、Attr对象 代表了某个标签中的属性。Attr继承于Node,但是因为Attr实际上是包含在Element中的,它并不能被看作是Element的子对象,因而在DOM中Attr并不是DOM树的一部分,所以Node中的getParentNode(),getPreviousSibling()和getNextSibling()返回的都将是null。也就是说,Attr其实是被看作包含它的Element对象的一部分,它并不作为DOM树中单独的一个节点出现。这一点在使用的时候要同其它的Node子对象相区别。
3、SAX解析 SAX是Simple API forXML的缩写,它并不是由W3C官方所提出的标准,可以说是“民间”的事实标准。实际上,它是一种社区性质的讨论产物。虽然如此,在XML中对SAX的应用丝毫不比DOM少,几乎所有的XML解析器都会支持它。 与DOM比较而言,SAX是一种轻量型的方法。我们知道,在处理DOM的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成DOM树上的每个Node对象。当文档比较小的时候,这不会造成什么问题,但是一旦文档大起来,处理DOM就会变得相当费时费力。特别是其对于内存的需求,也将是成倍的增长,以至于在某些应用中使用DOM是一件很不划算的事(比如在applet中)。这时候,一个较好的替代解决方法就是SAX。 SAX在概念上与DOM完全不同。首先,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。(如果你对Java新的代理事件模型比较清楚的话,就会很容易理解这种机制了) 回调:由我们在组件中定义,而不由我们调用,由容器或框架调用 SAX是推模型,它是一种靠事件驱动的模型。当它每发现一个节点就引发一个事件,而我们需要编写这些事件的处理程序。这样的做法很麻烦,且不灵活。
一、StAX 解析 针对于XML的流式API(StAX),是在2004年3月的JSR 173规范中引入,这是一种针对XML的流式拉分析API。StAX是JDK 6.0提供的一种新特征。 一个推模型分析器不断地生成事件,直到XML文档被完全分析结束。但是,拉分析由应用程序进行调整;因此,分析事件是由应用程序生成的。这意味着,使用StaX,你可以推迟分析-在分析时跳过元素并且分析多个文档。在使用DOM API的时候,你必须把整个的XML文档分析成一棵DOM结构,这样也就降低了分析效率。而借助于StAX,在分析XML文档时生成分析事件。
二、DOM4J 虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、 XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能。从2000下半年开始,它就一直处于开发之中。 为支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替 代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。 在添加灵活性、XPath集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java开发者的易用性和直观操作。它还致力于成为比 JDOM更完整的解决方案,实现在本质上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。 DOM4J是一个非常非常优秀的JavaXML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用DOM4J.
3、DOM与SAX的区别
一、DOM:拉模型,把整个文档加载到内存中 优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能; 缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间; 使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)
二、SAX:推模型,事件驱动编程,基于回调SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。 优点:不用事先调入整个文档,占用资源少; 缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素; 使用场合:数据量较大的XML文档,占用内存高,机器内存少,无法一次加载XML到内存;只需XML文档的少量内容,很少回头访问;
性能比较 1)DOM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J. 2)SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
①下载Dom4j框架,官网下载。
搜索dom4j,进入官网下载
下载并解压之后如下
双击index.html,就可以看到dom4j的API,方便使用
②在项目中创建一个文件夹:lib
③将dom4j-2.1.1.jar文件复制到 lib 文件夹
复制dom4j-2.1.1.jar文件
将dom4j-2.1.1.jar文件复制到 lib 文件夹
④在jar文件上点右键,选择 Add as library ,添加到库 -> 点击确定
⑤在类中导包使用
HTTP 的概念和介绍
概念: 超文本传输协议(Hyper Text Transfer Protocol)
作用: 规范了浏览器和服务器的数据交互
特点: 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET、HEAD、POST。每种方法规定了客 户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由Content-Type 加以标记。 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这 种方式可以节省传输时间。 无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信 息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。支持 B/S 及 C/S 模式。HTTP1.1 版本后支持可持续连接
3、HTTP 的交互流程:
HTTP 的交互流程一般分为四个步骤(一次完整的请求): 步骤一: 客户端和服务器端建立连接 步骤二: 客户端发送请求数据到服务器端(HTTP 协议) 步骤三: 服务器端接收到请求后,进行处理,然后将处理结果响应客户端(HTTP 协议) 步骤四: 关闭客户端和服务器端的连接(HTTP1.1 后不会立即关闭)
4、HTTP 协议之请求格式
请求格式的结构: 请求头:请求方式、请求的地址和 HTTP 协议版本 请求行:消息报头,一般用来说明客户端要使用的一些附加信息 空行: 位于请求行和请求数据之间,空行是必须的。 请求数据:非必须。
注意: 一张网页的内容是极其丰富的,浏览器会遵循HTTP 请求的格式将有效数据发送给服务器。
5、HTTP 协议之请求方式
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。HTTP1.1 新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和CONNECT 方法。
get 和 post 请求方式的区别: get 请求方式: 请求数据会以?的形式隔开拼接在请求头中,不安全,没有请求实体部分。HTTP 协议虽然没有规定请求数据的大小,但是浏览 器对 URL 的长度是有限制的,所以 get 请求不能携带大量的数据。
post 请求方式: 请求数据在请求实体中进行发送,在 URL 中看不到具体的请求数据,安全。适合数据量大的数据发送。
一、设计模式的分类
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。
三、Java的23中设计模式
从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析。
1、工厂方法模式(Factory Method)
工厂方法模式分为三种:
11、普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
22、多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
33、静态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
2、抽象工厂模式(Abstract Factory)
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解。
文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览86074 人正在系统学习中
堇安520
关注
0
0
0
java使用dom4j解析xml配置文件实现抽象工厂反射示例
09-04
本文主要介绍了java使用dom4j读取配置文件实现抽象工厂和反射的示例,在Java中也可以同Donet一样,将差异配置在配置文件里面。另外,我们采用下面的方式实现,将会更加便捷
dom4j解析xml文件源码 Dom4jXML.rar
09-27
Dom4j解析Xml文件源码 源码描述: 一、源码介绍 通过dom4j解析自定义xml文件 二、主要功能 自定义xml文件,自定义实体,通过dom4j解析出该xml的demo 三、注意事项 开发环境为jdk1.8,无数据库
xmldom4j解析
03-31
xml解析,dom4j解析,xml循环节点处理,java代码 jar包执行20190331.rar
dom4j---xml解析jar包
10-09
dom4j是一个简单的开源库,用于处理XML、 XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP。
分别使用DOM和DOM4j解析XML文件
03-13
分别使用DOM和DOM4j解析XML文件,因为目前使用最广泛的是DOM4j所以只写了用DOM4j对XML进行增删改查。
java解析xml之dom4j解析xml示例分享
09-04
DOM4J具有性能优异、功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml,dom4j是一套开源的api。实际项目中,往往选择dom4j来作为解析xml的利器
Dom4j解析XML(详解)
最新发布
qq_51447436的博客
9942
Dom4j解析XML(详解) DOM解析 SAX解析 使用Dom4j解析XML 结合XPath解析XML
DOM4J jar包 xml解析 所有的dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1包 导入直接使用
04-06
DOM4J jar包 所有的包 xml解析 dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1 导入直接使用
java使用dom4j生成与解析xml文档的方法示例
08-29
主要介绍了java使用dom4j生成与解析xml文档的方法,结合实例形式分析了java基于dom4j操作xml节点生成xml文档以及解析xml文档的相关操作技巧,需要的朋友可以参考下
通过dom4j解析xml字符串(示例代码)
09-04
本篇文章主要是对通过dom4j解析xml字符串的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
dom4j解析xml和soap报文
09-14
通过dom4j解析xml文件或xml字符串,同时利用dom4j解析soap报文,解析出所需要的字段,使用的相对比较基础,有需要的可以参考一下。
dom4j解析xml嵌套格式
08-06
xcjChapter.rar,xcjChapter.xml
java基于dom4j包实现对XML解析的方法
08-30
主要介绍了java基于dom4j包实现对XML解析的方法,结合实例形式分析了java针对xml格式数据的相关解析操作实现技巧,需要的朋友可以参考下
dom4j解析XML所需jar包
10-13
dom4j解析XML必备jardom4j解析XML必备jardom4j解析XML必备jardom4j解析XML必备jar
dom4j基于事件流解析大XML的文件 示例
08-12
解决普通方法解析大xml的文件时,内存严重不足。
dom4j-XML解析.zip
07-17
dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的...
java dom4j解析xml
08-18
java dom4j解析xml (详细注释)
java 解析xml所需要的dom4j包
08-01
java xml解析所需要的包
Android 创建与解析XML(五)——详解Dom4j方式
01-04
1、Dom4j概述 dom4j is an easy to use, open source library for working with XML, XPath and XSLT on ...本示例中,需要导入dom4j.jar包,才能引用dom4j相关类,dom4j源码和jar包,请见本示例【源码下载】或访问 d
java中使用dom4j解析XML文件的方法教程
08-26
在最近的开发中用到了dom4j来解析xml文件,所以便有了这篇文章,本文主要给大家介绍了关于java中使用dom4j
————————————————
版权声明:本文为CSDN博主「堇安520」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_67535780/article/details/128146145