XML报文解析测试
java如何解析http请求返回的xml报文

java如何解析http请求返回的xml报⽂xml报⽂解析⽅法有很多种,此处采⽤dom4j的⽅法。
dom4j的jar包下载地址:https://dom4j.github.io/#1、request.getInputStream()和new SAXReader().read(输⼊流):返回的报⽂如下:<?xml version="1.0" encoding="UTF-8"?><CreateAccessKeyResponse> <CreateAccessKeyResult> <AccessKey> <UserName>aaa</UserName> <AccessKeyId>2019dfc6ab5fe433f10c</AccessKeyId> <Status>Active</Status> <IsPrimary>false</IsPrimary> <SecretAccessKey>a14aeb3ac35b835d5ec4507d5667a353c77ceedc</SecretAccessKey></AccessKey></CreateAccessKeyResult></CreateAccessKeyResponse>获取参数AccessKeyId的值:import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;HttpURLConnection conn = create_AccessKey(); //create_AccessKey为⾃⼰写的http请求⽅法// 从request中取得输⼊流InputStream inputStream = conn.getInputStream();// 读取输⼊流SAXReader reader = new SAXReader();Document document = reader.read(inputStream);// 得到xml根元素Element root = document.getRootElement();String AK = root.element("CreateAccessKeyResult").element("AccessKey").element("AccessKeyId").getTextTrim();System.out.println("AccessKeyId="+AK+"\n");2、⽤dom4j读取xml⽂件中的参数:public void readXml() throws DocumentException, FileNotFoundException, IOException {String xml =System.getProperty("user.dir")+File.separator+"src"+File.separator+"test"+File.separator+"java"+File.separator+"http"+File.separator+"config.xml"; File xmlFile = new File(xml);SAXReader reader = new SAXReader();try {Document document = reader.read(xmlFile);Element root = document.getRootElement();AK = root.element("ak").getTextTrim();SK = root.element("sk").getTextTrim();} catch (Exception e) {e.printStackTrace();}}config.xml的内容如下:<?xml version="1.0" encoding="UTF-8"?><configuration> <ak>0d34d3db4bab560d343c</ak> <sk>a52628cb22b5a12642dd907075df6996b4c8a7b1</sk></configuration>。
招投标xml电子文件辅助检测系统

招投标XML电子文件辅助检测系统功能设计方案福建晨曦软件开发有限公司二零零六年元月目录第一章新建项目 (2)1.1工程项目设置 (2)1.2XML电子文档导入 (2)1.3最低控制价参数范围设置 (2)第二章 XML电子文件检测模块 (3)2.1报价偏差分析 (3)2.2算术性检测 (3)2.3不可竞争费检测 (3)2.4清单核对检测 (4)2.5负报价检测 (4)2.6主要项目检测 (4)2.7主要材料、设备检测 (4)2.8合理报价检测 (5)本系统由项目设置、XML电子文件检测模块两部分组成。
第一章项目设置本模块包括:工程项目设置、XML电子文档导入、最低控制价参数范围等部分。
1.1工程项目设置新建工程项目,输入相关信息。
包括:项目名称、工程概况(包括:专业类别、工程类别、工程所在地、劳保等级、单独施工类别、外墙装饰、缩短工期、税金区域、项目类别)、设置标段、小数点位数设置1.2 XML电子文档导入根据设置完成的标段数及每个标段下的项目数,将控制价XML电子文档和投标XML电子文件导入的功能,为自动计算最低控制价、投标XML电子文件检测提供数据基础。
允许直接输入或修改控制价和投标报价的造价值。
提供主要项目和主要材料设备的设置。
1.3最低控制价参数范围设置工程项目的最低控制价是由本系统自动计算产生,最低控制价计算参数是按照最低控制价的计算公式进行设置,参数设置范围按照招标文件的要求由用户自行设定,系统根据设定的范围自动计算出K值的取值范围及相应的控制价范围;并可直接输入具体的K1、K2、Q值,系统自动计算出唯一的控制价。
(K1、K2、Q值可通过取值范围随机抽取生成)计算公式:最低控制价=预算造价×(1-K)K= K1×Q + K2×(1- Q)第二章 XML电子文件检测模块本模块分为:报价偏差分析、算术性检测、不可竞争费检测、清单核对检测、负报价检测、主要项目检测、主要材料设备检测、合理报价检测等八部分。
利用 XMLPullParser 进行XML 数据解析和处理

利用 XMLPullParser 进行XML 数据解析和处理使用XMLPullParser进行XML数据解析和处理XMLPullParser是一种在Android平台上常用的用于解析和处理XML数据的工具。
它具有快速、高效的特点,能够准确地解析XML 文档,并提供了灵活的API来处理解析结果。
本文将介绍如何利用XMLPullParser进行XML数据解析和处理。
一、XML数据解析的概念和原理XML数据解析是指将XML文档中的数据提取出来并进行处理的过程。
XML文档是一种标记语言,用于描述结构化的数据。
XML数据解析的过程可以分为以下几个步骤:1. 创建XMLPullParser对象:首先,需要创建一个XMLPullParser 对象,用于解析XML文档。
2. 设置输入源:在进行XML数据解析之前,需要设置XMLPullParser的输入源。
输入源可以是一个文件、一个输入流或者一个URL。
3. 解析XML文档:通过调用XMLPullParser对象的相应方法,可以逐行解析XML文档,获取XML文档中的节点信息和数据。
4. 处理解析结果:根据XML数据的结构和需要,可以使用条件语句、循环结构等方式对解析结果进行处理,提取所需的数据,并进行后续的操作。
二、利用XMLPullParser进行XML数据解析的步骤下面逐步介绍如何使用XMLPullParser进行XML数据解析和处理的具体步骤。
步骤1:导入相关的类和包在使用XMLPullParser进行XML数据解析之前,需要导入相应的类和包。
具体的导入语句如下:import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlPullParserFactory;import java.io.InputStream;步骤2:创建XMLPullParser对象需要通过XmlPullParserFactory类的newInstance()方法创建XmlPullParserFactory对象,并通过XmlPullParserFactory对象的newPullParser()方法创建XMLPullParser对象,示例代码如下:XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser parser = factory.newPullParser();步骤3:设置输入源设置XMLPullParser对象的输入源,可以是一个输入流、一个文件或者一个URL。
java中xml进行报文发送和解析操作

java中xml进⾏报⽂发送和解析操作利⽤OKhttp⽹络框架,进⾏Maven项⽬管理//报⽂发送<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.8.0</version></dependency>//报⽂解析<dependency><groupId>xom</groupId><artifactId>xom</artifactId><version>1.2.5</version></dependency>报⽂⽰例<STUDENT><AGE>18</AGE><NAME><XING>赵</XING><MING>明⽟</MING></NAME><NAME><XING>沙</XING><MING>明德</MING></NAME></STUDENT>报⽂拼接StringBuffer strBuff = new StringBuffer();strBuff.append("<STUDENT>");strBuff.append("<AGE>18</AGE>");strBuff.append("<NAME>");strBuff.append("<XING>赵</XING>");strBuff.append("<MING>明⽟</MING>");strBuff.append("</NAME>");strBuff.append("<NAME>");strBuff.append("<XING>沙</XING>");strBuff.append("<MING>明德</MING>");strBuff.append("</NAME>");strBuff.append("</STUDENT>");String xmlStr = strBuff.toString;报⽂发送,post请求接⼝调⽤,xmlStr为xml格式请求参数体public String postXml(String xmlStr){//可改变请求参数体编码GBK/UTF-8RequestBody body= RequestBody.create(MediaType.parse("application/xml;charset=GBK"), xmlStr);//url为接⼝地址Request requestOk = new Request.Builder().url("http://192.168.0.103:8007").post(body).build();//⽹络请求OkHttpClient client = new OkHttpClient.Builder().retryOnConnectionFailure(true).build();//可⼿动设置连接时长OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(60000, LISECONDS).readTimeout(60000, LISECONDS).build();//获取处理结果Response response = null;try {response = client.newCall(requestOk).execute();} catch (IOException e) {e.printStackTrace();}//获取响应String jsonString = response.body().string();return jsonString;}报⽂解析,进⾏实体解析//STUDENT为XML最⼤节点JAXBContext context = JAXBContext.newInstance(STUDENT.class);Unmarshaller unmarshaller = context.createUnmarshaller();//jsonString为报⽂响应STUDENT student = (STUDENT)unmarshaller.unmarshal(new StringReader(jsonString));实体类//XmlRootElement注解是将类与XML元素进⾏映射,XML节点与属性⼤⼩写保持⼀致@XmlRootElement(name ="STUDENT")public class STUDENT implements Serializable {private String AGE;private List<NAME> NAME;public String getAGE() {return AGE;}public void setAGE(String AGE) {this.AGE = AGE;}public List<NAME> getNAME() {return NAME;}public void setNAME(List<NAME> NAME) { = NAME;}@Overridepublic String toString() {return "Cccc{" +"AGE='" + AGE + '\'' +", NAME=" + NAME +'}';}}补充知识:Java发送内容为xml格式请求并解析返回json结果封装成静态请求⽅法:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import .ConnectException;import .MalformedURLException;import .URL;import .URLConnection;/*** 发送HTTP的⼀种⽅法* GaoLiang*/public class HttpSendUtil {public static String xmlPost(String urlStr, String xmlInfo) {try {URL url = new URL(urlStr);URLConnection con = url.openConnection();con.setDoOutput(true);// con.setRequestProperty("Pragma:", "no-cache");// con.setRequestProperty("Cache-Control", "no-cache");// ⼀定要设置报⽂格式,否则发送失败con.setRequestProperty("Content-Type", "text/xml");OutputStreamWriter out = null;try {out = new OutputStreamWriter(con.getOutputStream());} catch (ConnectException e) {// e.printStackTrace();return "Connection refused";}// System.out.println("urlStr=" + urlStr);// System.out.println("xmlInfo=" + xmlInfo);out.write(new String(xmlInfo.getBytes("ISO-8859-1")));out.flush();out.close();BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));StringBuilder stringBuilder = new StringBuilder();String line = "";for (line = br.readLine(); line != null; line = br.readLine()) {// System.out.println(line);stringBuilder.append(line);}return stringBuilder.toString();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}在外部调⽤静态⽅法:// 请求的xml服务地址String url = url;// 请求参数由于是⼿动拼写的参数很长看起来也不美观就不放了(⼿动哭脸)String param = "" ;// 发送请求调⽤上⾯的静态⽅法String ret = xmlPost(url,param);// 得到的是xml格式的返回结果但是⾥⾯的“<”,“>”都是“<”,“>”显⽰所以就需要解析,具体解析见下表ret = ret.replaceAll("<", "<");ret = ret.replaceAll(">", ">");ret = ret.replaceAll("&", "&");ret = ret.replaceAll(""", "\"");ret = ret.replaceAll("'", "\'");// 因为接⼝最终要返回的是json格式所以还要把想要的值取出来解析成String// 解析拿到节点⾥想要的值Document document = DocumentHelper.parseText(ret);// 根节点这⾥不⼀定要和根节点取⼀样的名字可⾃定义这么写是⽅便理解Element root = document.getRootElement();// root节点下的⼦节点Element business = root.element("business");//解析完取到business节点下的值String healthCode = business.getStringValue();// 拼接返回值Map<String,Object> thisResult = new HashMap();thisResult.put("healthCode",healthCode);resultList.add(thisResult);// 统⼀返回值Map<String,Object> returnset = new HashMap<>();xml解析五种格式:补充⼀下:xml返回结果类似于这样<?xml version="1.0" encoding="utf-8" ?><Root><business>我想要的值:healthCode</business ></Root>最后,由于时间⽐较匆忙,⼜没有接触过xml格式请求,确实折磨了我⼀阵⼦时间,搜了好多⼤神写的博客,最终整理出⾃⼰的。
XML与JSON报文解析

XML解析
JDOM
JDOM的目的是成为Java特定文档模型,它简 化与XML的交互并且比使用DOM实现更快。由于是 第一个Java特定模型,JDOM一直得到大力推广和 促进。正在考虑通过“Java规范请求JSR-102”将 它最终用作“Java标准扩展”。从2000年初就已经 开始了JDOM开发。 JDOM自身不包含解析器。它通常使用SAX2 解析器来解析和验证输入XML文档(尽管它还可以 将以前构造的DOM表示作为输入)。它包含一些转 换器以将JDOM表示输出成SAX2事件流、DOM模型 或XML文本文档。JDOM是在Apache许可证变体下 发布的开放源码。 2016/10/22
*
XML解析
DOM解析
DOM是用与平台和语言无关的方式表示XML文档的官 方W3C标准。DOM是以层次结构组织的节点或信息片断的集 合。这个层次结构允许开发人员在树中寻找特定信息。分析该 结构通常需要加载整个文档和构造层次结构,然后才能做任何 工作。由于它是基于信息层次的,因而DOM被认为是基于树 或基于对象的。DOM以及广义的基于树的处理具有几个优点。 首先,由于树在内存中是持久的,因此可以修改它以便应用程 序能对数据和结构作出更改。它还可以在任何时候在树中上下 导航,而不是像SAX那样是一次性的处理。DOM使用起来也 要简单得多。
2016/10/22
JSON简介
JSON格式
1,对象是属性、值对的集合。一个对象的开始于“{”, 结束于“}”。每一个属性名和值间用“:”提示,属性间 用“,”分隔。 2,数组是有顺序的值的集合。一个数组开始于“[”,结 束于“]”,值之间用“,”分隔。 3,值可以是引号里的字符串、数字、true、false、null, 也可以是对象或数组。这些结构都能嵌套。
qt 解析xml报文的方法

qt 解析xml报文的方法Qt是一种流行的跨平台应用程序开发框架,提供了丰富的功能和工具,用于开发各种类型的应用程序。
其中,XML解析是Qt框架中的一个重要功能,可以用于解析XML格式的报文数据。
本文将介绍Qt中解析XML报文的方法。
一、Qt中解析XML报文的基本概念在开始介绍Qt中的XML解析方法之前,我们先来了解一下XML 报文的基本概念。
XML是一种标记语言,用于描述结构化的数据。
XML报文由标签、属性和文本内容组成,通过标签和属性来表示数据的结构和关系,通过文本内容来存储实际的数据。
二、Qt中解析XML报文的方法Qt提供了QXmlStreamReader和QXmlStreamWriter两个类,用于解析和生成XML报文。
其中,QXmlStreamReader用于解析XML报文,而QXmlStreamWriter用于生成XML报文。
1. 使用QXmlStreamReader解析XML报文QXmlStreamReader类提供了一种流式的方式来解析XML报文。
它可以逐行读取XML报文,并提供了一系列的方法来获取当前节点的信息,如节点的名称、属性和文本内容等。
在使用QXmlStreamReader解析XML报文时,可以按照以下步骤进行操作:(1)创建QXmlStreamReader对象,并将要解析的XML报文作为输入流传入。
(2)使用readNext()方法读取XML报文的下一个节点。
(3)根据节点的类型,使用相应的方法来获取节点的信息,如name()方法获取节点的名称,attributes()方法获取节点的属性等。
(4)使用hasNext()方法判断是否还有下一个节点,如果有,则返回true,否则返回false。
(5)重复步骤2到步骤4,直到解析完整个XML报文。
下面是一个使用QXmlStreamReader解析XML报文的示例代码:```cppQXmlStreamReader reader(xmlData); // 创建QXmlStreamReader对象while (!reader.atEnd()) {reader.readNext(); // 读取下一个节点if (reader.isStartElement()) { // 判断当前节点是否是开始元素 qDebug() << "Element Name:" << (); // 输出节点名称QXmlStreamAttributes attributes = reader.attributes(); // 获取节点的属性for (int i = 0; i < attributes.size(); i++) {qDebug() << "Attribute Name:" << attributes[i].name() << "Value:" << attributes[i].value(); // 输出属性名称和值}if (reader.isCharacters()) { // 判断当前节点是否是文本内容qDebug() << "Text Content:" << reader.text(); // 输出文本内容}}}if (reader.hasError()) {qDebug() << "XML parsing error:" << reader.errorString(); // 输出解析错误信息}```2. 使用QXmlStreamWriter生成XML报文QXmlStreamWriter类提供了一种方便的方式来生成XML报文。
报文解析实训(共8张PPT)

1、编写XML数据报文获取模块 2、编写XML数据报文解析模块 3、配置数据库链接参数 4、编写XML数据报文解析后写入数据表模块 5、程序测试
第6页,共8页。
模块七:物流数据交换技术
四、实验报告
第7页,共8页。
五、实训检查
工作任务 评价对象
XML数据报文解析
班级 物信1111
工作学期
掌数握据编 报写文程解序析将模数块任据(务报3内0容文分写)入相应12的、 、数编 编据写 写表程 程的序 序技获 解能取 析。数 数据 据报 报文 文, 。并将报文保存为相应的XML文件。
3、配置数据库链接参数
3、编写程序将数据报文写入相应的数据表。
模块七:物流数据交换技术
2、编写XML数据报文解析模块
物流信息技术与应用
Logistics Information Technology & Application
模块七:物流数据交换技术 任务:XML数据报文解析
物流信息系 杨晓峰
第1页,共8页。
模块七:物流数据交换技术
本模块知识点:
1、掌握XML数据报文的基本结构; 2、掌握如何调用Web服务获取XML数据报文; 3、掌握如何解析XML数据报文; 4、掌握如何将解析的XML数据报文的数据写入相应的 数据表。
第3页,共8页。
模块七:物流数据交换技术
二、实验目的
通过XML数据报文解析的实训,掌握编写程序获取数据报文, 3任、务配:置X数ML据数库据链并报接文将参解数析报文保存为相应的XML文件的技能;掌握编写程序解析数据 数据报文解析模报块(文30分的)技能;掌握编写程序将数据报文写入相应的数据表的技
2、硬件环境
4、掌握如何将解析的XML数据报文的数据写入相应的数据表。 2数、据掌报握文如解何析调模用块提W(交e3b资0服料分务)获取XM12L、 、数完 实据整 训报的 报文数 告;据交换源程序。
xml文件解析方法

xml文件解析方法XML文件解析方法引言:XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它具有良好的可读性和灵活性,被广泛应用于数据交换和配置文件等领域。
在处理XML文件时,解析是必不可少的环节。
本文将介绍几种常用的XML文件解析方法,包括DOM、SAX和StAX。
一、DOM解析方法DOM(文档对象模型)是一种将整个XML文件以树形结构加载到内存中的解析方法。
DOM解析器将XML文件解析为一个树状结构,通过遍历节点来获取和操作XML文件中的数据。
DOM解析方法的优点是易于理解和使用,可以随机访问XML文件中的任意节点,但缺点是占用内存较大,不适用于大型XML文件的解析。
1. 创建DOM解析器对象:使用标准的Java API,可以通过DocumentBuilderFactory类来创建DOM解析器对象。
2. 加载XML文件:通过DOM解析器对象的parse()方法加载XML文件,将其转化为一个树形结构。
3. 遍历节点:使用DOM解析器对象提供的方法,如getElementsByTagName()、getChildNodes()等,可以遍历XML文件中的各个节点,获取节点的名称、属性和文本内容等信息。
4. 获取节点数据:通过节点对象提供的方法,如getNodeName()、getTextContent()等,可以获取节点的名称和文本内容。
二、SAX解析方法SAX(简单API for XML)是一种基于事件驱动的XML解析方法。
在SAX解析过程中,解析器顺序读取XML文件,当遇到节点开始、节点结束或节点文本等事件时,会触发相应的回调方法。
相比于DOM 解析方法,SAX解析方法具有内存占用小、解析速度快的优点,但缺点是无法随机访问XML文件中的节点。
1. 创建SAX解析器对象:使用标准的Java API,可以通过SAXParserFactory类来创建SAX解析器对象。
2. 实现事件处理器:自定义一个事件处理器,实现SAX解析器提供的DefaultHandler类,并重写相应的回调方法,如startElement()、endElement()和characters()等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
XML报文解析测试在平时工作中,难免会遇到把 XML 作为数据存储格式。
面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML 这块来测试,因为遍历 XML 是工作中使用最多的(至少我认为)。
预备测试环境:AMD 毒龙1.4G OC 1.5G、256M DDR333、Windows2000 Server SP4、Sun JDK 1.4.1+Eclipse 2.1+Resin 2.1.8,在 Debug 模式下测试。
XML 文件格式如下:<?xml version="1.0" encoding="GB2312"?><RESULT><VALUE><NO>A1234</NO><ADDR>四川省XX县XX镇XX路X段XX号</ADDR></VALUE><VALUE><NO>B1234</NO><ADDR>四川省XX市XX乡XX村XX组</ADDR></VALUE></RESULT>测试方法:采用 JSP 端调用Bean(至于为什么采用JSP来调用,请参考:/rosen/archive/2004/10/15/138324.aspx),让每一种方案分别解析10K、100K、1000K、10000K的 XML 文件,计算其消耗时间(单位:毫秒)。
JSP 文件:<%@ page contentType="text/html; charset=gb2312" %><%@ page import="com.test.*"%><html><body><%String args[]={""};MyXMLReader.main(args);%></body></html>测试首先出场的是 DOM(JAXP Crimson 解析器)DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。
DOM 是以层次结构组织的节点或信息片断的集合。
这个层次结构允许开发人员在树中寻找特定信息。
分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。
由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。
DOM 以及广义的基于树的处理具有几个优点。
首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。
它还可以在任何时候在树中上下导航,而不是像 SAX 那样是一次性的处理。
DOM 使用起来也要简单得多。
另一方面,对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。
这些基于事件的模型,比如 SAX。
Bean文件:package com.test;import java.io.*;import java.util.*;import org.w3c.dom.*;import javax.xml.parsers.*;public class MyXMLReader{public static void main(String arge[]){long lasting =System.currentTimeMillis();try{File f=new File("data_10k.xml");DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();DocumentBuilder builder=factory.newDocumentBuilder();Document doc = builder.parse(f);NodeList nl = doc.getElementsByTagName("VALUE");for (int i=0;i<nl.getLength();i++){System.out.print("车牌号码:" +doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());System.out.println(" 车主地址:" +doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());}}catch(Exception e){e.printStackTrace();}System.out.println("运行时间:"+(System.currentTimeMillis() - lasting)+" 毫秒");}} s10k消耗时间:265 203 219 172100k消耗时间:9172 9016 8891 90001000k消耗时间:691719 675407 708375 73965610000k消耗时间:OutOfMemoryError接着是 SAX这种处理的优点非常类似于流媒体的优点。
分析能够立即开始,而不是等待所有的数据被处理。
而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
这对于大型文档来说是个巨大的优点。
事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
一般来说,SAX 还比它的替代者 DOM 快许多。
选择 DOM 还是选择 SAX ?对于需要自己编写代码来处理 XML 文档的开发人员来说,选择 DOM 还是 SAX 解析模型是一个非常重要的设计决策。
DOM 采用建立树形结构的方式访问 XML 文档,而 SAX 采用的事件模型。
DOM 解析器把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。
用 DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。
可以很容易的添加和修改树中的元素。
然而由于使用 DOM 解析器的时候需要处理整个 XML 文档,所以对性能和内存的要求比较高,尤其是遇到很大的 XML 文件的时候。
由于它的遍历能力,DOM 解析器常用于 XML 文档需要频繁的改变的服务中。
SAX 解析器采用了基于事件的模型,它在解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。
SAX 对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。
特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。
但用 SAX 解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
Bean文件:package com.test;import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*;public class MyXMLReader extends DefaultHandler {java.util.Stack tags = new java.util.Stack();public MyXMLReader() {super();}public static void main(String args[]) {long lasting = System.currentTimeMillis();try {SAXParserFactory sf = SAXParserFactory.newInstance();SAXParser sp = sf.newSAXParser();MyXMLReader reader = new MyXMLReader();sp.parse(new InputSource("data_10k.xml"), reader);} catch (Exception e) {e.printStackTrace();}System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + " 毫秒");}public void characters(char ch[], int start, int length) throws SAXException { String tag = (String) tags.peek();if (tag.equals("NO")) {System.out.print("车牌号码:" + new String(ch, start, length));}if (tag.equals("ADDR")) {System.out.println(" 地址:" + new String(ch, start, length));}}public void startElement(String uri,String localName,String qName,Attributes attrs) {tags.push(qName);}}10k消耗时间:110 47 109 78100k消耗时间:344 406 375 4221000k消耗时间:3234 3281 3688 331210000k消耗时间:32578 34313 31797 31890 30328然后是 JDOM /JDOM 的目的是成为 Java 特定文档模型,它简化与 XML 的交互并且比使用 DOM 实现更快。
由于是第一个 Java 特定模型,JDOM 一直得到大力推广和促进。
正在考虑通过“Java 规范请求JSR-102”将它最终用作“Java 标准扩展”。
从 2000 年初就已经开始了 JDOM 开发。
JDOM 与 DOM 主要有两方面不同。
首先,JDOM 仅使用具体类而不使用接口。
这在某些方面简化了 API,但是也限制了灵活性。
第二,API 大量使用了 Collections 类,简化了那些已经熟悉这些类的 Java 开发者的使用。
JDOM 文档声明其目的是“使用 20%(或更少)的精力解决 80%(或更多)Java/XML 问题”(根据学习曲线假定为 20%)。
JDOM 对于大多数 Java/XML 应用程序来说当然是有用的,并且大多数开发者发现 API 比 DOM 容易理解得多。