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()等。
java xml格式返回报文解析
java xml格式返回报文解析Java中可以使用多种方式解析XML格式的返回报文,常见的方式有DOM解析、SAX解析以及基于XML绑定技术的解析。
每种方式都有不同的特点和适用场景,下面将详细介绍这三种解析方式。
1. DOM解析:DOM(Document Object Model)解析是将整个XML文档加载到内存中,构建成一个树形结构,并提供API来操作这个树。
DOM解析提供了许多API,可以通过节点遍历和搜索、属性读取和设置、节点创建和删除等方式来处理XML文档。
DOM解析适用于对XML文档进行多次读写操作,如增删改查等复杂的操作。
使用Java的DOM解析,可以通过以下几个步骤实现:1)使用DocumentBuilderFactory创建一个DocumentBuilder对象。
2)调用DocumentBuilder的parse方法,传入XML文件的输入流,将XML文档解析为一个Document对象。
3)通过Document对象可以获取XML文档的根元素,从而开始对XML文档进行遍历和操作。
DOM解析的优点是能够将整个XML文档加载到内存中,便于操作和修改。
但是对于较大的XML文件,DOM解析会消耗大量的内存空间。
2. SAX解析:SAX(Simple API for XML)解析是一种基于事件驱动的解析方式,它逐行读取XML文档并触发相应的事件,应用程序根据事件的发生来处理XML文档。
SAX解析的特点是速度快、内存消耗小,适用于对XML文档进行单次顺序读取的操作。
使用Java的SAX解析,可以通过以下几个步骤实现:1)定义一个继承自DefaultHandler的处理器类,重写相应的事件回调方法。
2)使用SAXParserFactory创建一个SAXParser对象。
3)调用SAXParser的parse方法,传入XML文件的输入流和处理器对象,开始解析XML文档。
SAX解析的优点是速度快,内存消耗小,适用于大型XML文件的解析。
基于XML的多协议报文解析的方法与实现
Ab s t r a c t : Al t h oug h t h e r e a r e nu me r o us m e s s a ge p r o t oc ol s i n t he f i e l d o f m o de r n i n dus t r i al c on t r o l ,t he r e a l — t i me pe r f or ma nc e a n d t he me s s a ge pa r s i n g e f f i c i e n c y of t r a di t i on a l me s s a ge pa r s i ng t e c hni q ue s a r e s t i l l p oo r . To s ol v e t he
摘 要 :在 现 代 工 业 控 制 领 域 中 , 尽管报文协议种类 繁多 , 传统 的报文解 析技术仍存 在着实 时性低 , 对 多 协 议 报 文 解 析 效 率 低 等 缺 点 。针 对 上 述 问题 , 考 虑 到 使 用 XML文 档 作 为报 文 解 析 协 议 的优 点 , 本文提 出了一种 基于 X ML 的 多
上述各种报文解析方法虽然能实现报文的解析但都存在不足为提高报文解析的速率同时能实现多种不同格式的报文解析本文在充分了解工业控制系统的实际应用特点的基础上考虑到基于xml报文解析方法的优点提出了一种基于xml的多格式报文解析方法5实现了多协议报文的实时快速解析在实际的系统中得到了广泛的应用
电
子
测
量
技
术
Wu J i a n b i n Z o u P e i j i a n g
( S c h o o l o f Ph y s i c a l S c i e n c e a n d Te c h n o l o g y,Ce nt r a l Ch i na No r ma l Un i v e r s i t y,W u h a n 4 3 0 0 7 9 ,Chi n a )
RENIX操作之XML报文模板说明——网络测试仪实操
RENIX操作之 XML报文模板说明 ——网络测试仪实操
我们在网络测试仪的日常使用过程中,经常涉及到编辑和修改报文。利用RENIX软件,可以把当前编辑好的报文模板导出为XML文件,下次 使用时可以直接导入使用,从而提升测试工作效率。本文以“添加UDP 头部”为例,讲解具体操作方法。
一、导出 XML文件
1、当前有一个报文模板,添加了头部
2、现在将这个文档导出为XML文件
3、查看保存的XML文件
二、导入 XML文件
1、新建一条流量
2、导入之前的XML文件,作为报文的模板
3、查看报文模板:多了UDP头部,就是之前编辑的内容
qt 解析xml报文的方法
qt 解析xml报文的方法【原创版4篇】篇1 目录1.引言2.Qt 解析 XML 报文的方法3.Qt 解析 XML 报文的应用4.结论篇1正文Qt 解析 XML 报文的方法Qt 是一个流行的 C++ 框架,它提供了许多功能强大的类和库,用于解析和生成 XML 文档。
下面介绍一些解析 XML 报文的方法。
1.使用 QDomDocument 类解析 XML 文档QDomDocument 类是 Qt 中用于解析和操作XML 文档的核心类之一。
使用 QDomDocument,可以轻松地解析 XML 文档并提取所需的数据。
下面是一个简单的示例代码:```cppQDomDocument doc;if (doc.setContent(xmlString)) {QDomElement root = doc.documentElement();// 处理根元素}```2.使用 QDomElement 类获取 XML 文档中的元素QDomElement 类表示 XML 文档中的元素节点。
使用 QDomElement,可以轻松地获取 XML 文档中的元素节点,并对其进行操作。
下面是一个简单的示例代码:```cppQDomElement element = doc.documentElement();QDomNodeList children = element.childNodes();for (int i = 0; i u003c children.count(); i++) {QDomNode child = children.at(i);if (child.isElement()) {QDomElement childElement = child.toElement();// 处理子元素}}```3.使用 QDomXPath 类查询 XML 文档中的元素QDomXPath 类提供了使用XPath表达式查询 XML 文档的能力。
XML报文解析-配置说明书
XML报文解析配置说明书开发三部EPS项目组2009年2月文档信息及修订记录填写说明:1、项目名称、项目编号、项目经理、项目总监按照本项目实际情况填写。
2、文档密级是该文档允许扩散的范围。
对于交通银行,机密文件必须由信息科技部经理室批准方可借阅;秘密文件必须由项目负责人批准方可借阅;内部文件经一般授权后可由在项目组内部传阅;公开文件不需经过授权,可自由进行阅读。
对于高阳公司,机密文件、秘密文件必须由银行产品事业部经理室批准方可借阅;内部文件经一般授权后可由在公司内部和项目组内部传阅;公开文件不需经过授权,可自由进行阅读。
3、文档主送是指该文档应该主送的对象,双方项目总监、项目经理是该文档必须主送的对象之一。
4、文档抄送是指该文档应该抄送的对象,项目管理组是该文档应该抄送的对象之一。
5、版本号是指该文档的版本次序号,该文档首次发布时可确定为1.0,如果在上一版的基础上有细微的调整和修改,则可在小数点后次版本号加1;如果该文档内容总体上有重大变化或增加/删除了重要章节,则小数点主版本号加1。
目录1引言 (1)2设计思路 (2)3XML格式定义文件说明 (3)3.1 文件结构 (3)3.2 元素说明 (4)3.2.1 应用接口定义Application (4)3.2.2 获取交易码GetTxnCode (4)3.2.3 信息码CodeSwitching (4)3.2.4 宏定义Define (4)3.2.5 交易定义Transaction (4)3.2.6 XML节点定位规则 (4)3.2.7 ETF节点定位规则 (5)3.2.8 访问XML节点元素ReadElement (5)3.2.9 访问XML节点元素GetElement (5)3.2.10 访问XML节点元素组ReadGroupElement (6)3.2.11 构造XML节点元素WriteElement (7)3.2.12 构造XML节点元素组WriteGroupElement (7)3.2.13 访问XML节点属性元素ReadAttr (8)3.2.14 构造XML节点属性元素WriteAttr (8)3.2.15 ETF节点加工语句 (8)3.2.16 消息头加工语句 (9)3.2.17 控制语句 (9)3.2.18 辅助语句 (9)1引言本文档为解析与构造XML格式报文部分的设计说明。
java xml格式返回报文解析
一、概述随着互联网的不断发展,各种Web服务也愈发普及,而这些Web服务通常都是通过HTTP协议来进行通信的。
在Web服务之间进行通信时,数据的传递通常采用XML格式,而Java作为一种常用的编程语言,在处理XML格式数据时也是非常常见的。
二、XML格式返回报文解析的重要性1. XML格式返回报文在Web服务中的应用在Web服务中,XML格式的返回报文被广泛应用于数据的传输和交换。
而对于接收到的XML格式返回报文,需要进行解析和处理,才能够得到其中的有用信息。
2. Java在XML解析中的重要性在Java中,有许多用于解析XML格式数据的工具和库,比如DOM、SAX、JAXB等。
正确地使用这些工具和库,可以高效地对XML格式返回报文进行解析,从而获取其中的数据。
三、Java中XML格式返回报文解析的方法1. 使用DOM进行XML解析DOM(Document Object Model)是一种基于树形结构的XML解析模型,它将整个XML文档作为一个树形结构加载到内存中,并提供了一系列的API来操作这个树形结构。
通过使用DOM,可以方便地对XML格式返回报文进行遍历和操作,获取其中的数据。
2. 使用SAX进行XML解析SAX(Simple API for XML)是一种基于事件驱动的XML解析模型,它以事件驱动的方式逐行扫描XML文档,并触发相应的事件进行解析。
相比DOM,SAX在解析大型XML文档时占用的内存较少,因此性能更优。
通过使用SAX,可以高效地对XML格式返回报文进行解析,获取其中的数据。
3. 使用JAXB进行XML解析JAXB(Java Architecture for XML Binding)是一种将XML数据转换为Java对象的技术,它通过注解和Java类的映射关系,实现了XML数据的自动绑定和解析。
通过使用JAXB,可以将XML格式返回报文直接映射为Java对象,从而方便地进行数据操作和处理。
qt解析xml报文的方法
qt解析xml报文的方法Qt提供了一种方便解析XML报文的方法,通过使用Qt的Xml模块,我们可以轻松地解析和操作XML数据。
在下面的文章中,将会详细介绍如何使用Qt解析XML报文,包括如何读取和操作XML元素、属性和文本内容。
1. 引入Xml模块首先,在项目的.pro文件或者CMake文件中,添加对Xml模块的引用。
如下所示:```QT += xml```这样,我们就可以在代码中使用Xml相关的类和函数了。
2. 创建QXmlStreamReader对象Qt提供了一个QXmlStreamReader类,用于逐行读取和解析XML数据。
首先,我们需要创建一个QXmlStreamReader对象,以便进行解析操作。
```QXmlStreamReader reader;```3.打开XML文件我们可以通过QFile类来打开一个XML文件。
如下所示,我们使用QFile的构造函数来打开一个XML文件,并将其传递给QXmlStreamReader 对象的setDevice(函数。
```QFile file("path/to/xml/file.xml");if (!file.open(QIODevice::ReadOnly , QIODevice::Text))//文件打开错误处理reader.setDevice(&file);```4.解析XML数据通过QXmlStreamReader对象的readNext(函数,我们可以边读取XML 数据边解析。
在解析过程中,我们可以通过判断reader.tokenType(的值来确定当前读取到的内容类型:StartElement(开始元素)、EndElement (结束元素)、Characters(文本内容)等等。
```while (!reader.atEnd( && !reader.hasError()if (reader.readNext( == QXmlStreamReader::StartElement)//处理开始元素}if (reader.hasError()//解析错误处理```5.处理元素和属性在读取到开始元素(StartElement)时,我们可以通过(获取当前元素的名称,并通过reader.attributes(获取当前元素的所有属性。
webservice xml报文解析
webservice xml报文解析在现代的软件开发中,很常见的一种数据交互格式就是XML (eXtensible Markup Language),它是一种用于标记电子文件结构的语言。
虽然XML本身是一种文本格式,但是通过使用Web Services,我们可以将XML数据传输到不同的系统之间进行通信。
本文将重点讨论如何解析Webservice中的XML报文。
1. 概述在Webservice中,XML报文是一种常见的数据交换格式。
通过Webservice,不同的系统可以通过定义好的接口规范,以XML报文的形式进行数据交互。
为了能够对XML报文进行解析,我们需要使用特定的解析器。
2. Webservice的XML报文结构在Webservice中,XML报文的结构往往由两部分组成:报文头和报文体。
报文头通常用于传递一些元数据,例如接口版本、报文发送者等信息。
而报文体则是实际的数据内容,其中包含不同的标签和值。
3. 解析XML报文的方法3.1 使用DOM解析器DOM(Document Object Model)是一种解析XML文档的标准方式。
它将XML文档解析成一个树形结构,在内存中存储为DOM树。
我们可以通过遍历DOM树的方式来获取XML报文中的各个元素和属性。
使用DOM解析器的一般步骤如下:a. 创建一个DocumentBuilderFactory对象。
b. 通过DocumentBuilderFactory对象创建一个DocumentBuilder对象。
c. 通过DocumentBuilder对象的parse方法,将XML输入流解析为一个Document对象。
d. 通过Document对象获取各个元素和属性,并进行相应的处理。
3.2 使用SAX解析器SAX(Simple API for XML)是一种基于事件驱动的解析方式。
它通过回调函数的方式逐行读取XML文档,并在读取到特定的节点时触发相应的事件。
webservice xml报文解析
Webservice XML报文解析是处理Webservice通信中的XML格式数据的过程。
在Webservice通信中,数据通常以XML格式进行传输,因此解析XML报文是获取和处理这些数据的关键步骤。
以下是解析Webservice XML报文的一般步骤:
1. 接收XML报文:首先,你需要从Webservice接收XML报文。
这通常通过HTTP请求完成,请求可以包含XML数据作为请求体或请求头。
2. 解析XML报文:一旦你接收到XML报文,你需要将其解析为可理解和操作的数据结构。
这通常使用XML解析器来完成,如SAX、DOM 或StAX等。
这些解析器可以将XML文档转换为内存中的树状结构或流式处理方式,以便于进一步的处理。
3. 提取数据:一旦XML报文被解析,你可以提取其中的数据。
根据XML文档的结构和内容,你可以使用XPath或CSS选择器等查询语言来定位和提取所需的数据。
4. 处理数据:一旦你提取了数据,你可以根据需要进行进一步的处理。
这可能包括验证数据、转换数据格式、执行计算或逻辑操作等。
5. 返回结果:最后,你可以将处理后的结果返回给Webservice调用方。
这可以通过构造响应报文并将其发送回调用方来完成。
响应报文可以是XML、JSON或其他格式,具体取决于Webservice的规范和要求。
需要注意的是,具体的解析过程取决于你使用的编程语言和库。
不同的语言和库提供了不同的XML解析器和API来处理XML报文。
因此,在编写代码时,你需要参考所选语言和库的文档和示例来了解如何解析XML报文和处理数据。
XML报文解析
XML报⽂解析/*** XML报⽂解析* @param docStr*/private Map<String, Object> analysisXmlStr(String xmlStr) {try {Map<String, Object> analysisResultMap = new HashMap<>();if (StringUtils.isEmpty(xmlStr)) {return analysisResultMap;}org.dom4j.Document payResponseDoc = DocumentHelper.parseText(xmlStr);org.dom4j.Element rootElement = payResponseDoc.getRootElement();// HeaderNode headerNode = rootElement.selectSingleNode("Header");String status = headerNode.selectSingleNode("Status").getStringValue();// ResponseNode responseNode = rootElement.selectSingleNode("Response");if (null == responseNode) {return analysisResultMap;}Node orderStatusNode = responseNode.selectSingleNode("OrderStatus");if (null == orderStatusNode) {return analysisResultMap;}String orderStatus = orderStatusNode.getStringValue();String platformCode = responseNode.selectSingleNode("PlatformCode").getStringValue();String payAmount = responseNode.selectSingleNode("PayAmount").getStringValue();String realPayAmount = responseNode.selectSingleNode("RealPayAmount").getStringValue();String orderId = responseNode.selectSingleNode("OrderId").getStringValue();// Response - TradeListNode tradeListNode = responseNode.selectSingleNode("TradeList");String batchNo = tradeListNode.selectSingleNode("TradeIfo").selectSingleNode("BatchDetailNo").getStringValue(); // 封装analysisResultMap.put("status", status);analysisResultMap.put("orderStatus", orderStatus);analysisResultMap.put("platformCode", platformCode);analysisResultMap.put("payAmount", payAmount);analysisResultMap.put("realPayAmount", realPayAmount);analysisResultMap.put("orderId", orderId);analysisResultMap.put("batchNo", batchNo);return analysisResultMap;} catch (DocumentException e) {logger.error("报⽂解析异常!", e);}return null;}。
XML报文解析测试
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 标准。
调用中行接口针对返回报文(xml形式)做相关处理
调⽤中⾏接⼝针对返回报⽂(xml形式)做相关处理最近在对接中⾏银⾏接⼝,在获取返回报⽂的时候遇到⼀些问题,现在在这⾥做个总结TIP:在返回报⽂之前,要对前置机的URL请求,在这期间遇到⼀个坑,还是通过查看⽇志才发现问题在填写转账信息的时候要求输⼊转账公司名称,但是银⾏接⼝⼜不会强制对转账公司名称校验,⽽且转账操作也会显⽰成功,只是在查询交易状态的时候才会显⽰交易失败被银⾏退回/收款⼈账号和收款⼈名称不⼀致的错误当时有点懵逼,还仔细检查到底有没有输错信息 = =后来使⽤Postman把我要发送的报⽂粘贴进去,发现成功!这时候才发现是编码问题原来最开始使⽤下⾯⽅法设置字符集// 设置⽂件字符集:conn.setRequestProperty("Charset", "UTF-8");发现这样不会把字符设置为UTF-8的编码,所以系统就取了默认的编码格式原来是要在转换为字节数组的时候给它设置字符编码//转换为字节数组byte[] data = xml.getBytes("UTF-8");1.普通报⽂<?xml version="1.0" encoding="UTF-8"?><bocb2e version="120" locale="zh_CN"><head><termid>E192168000105</termid><trnid>20060704001</trnid><custid>133724203</custid><cusopr>135989127</cusopr><trncod>b2e0001</trncod><token>SyX3PnpuNdIQm6FDj1SgZn8</token></head><trans><trn-b2e0001-rs><status><rspcod>B001</rspcod><rspmsg>ok</rspmsg></status><serverdt>20180126105944</serverdt><token>SyX3PnpuNdIQm6FDj1SgZn8</token></trn-b2e0001-rs></trans></bocb2e>上⾯是调⽤银⾏接⼝成功签到的报⽂,类似于这样的特征就⽐较明显,不需要做任何处理,就能通过下⾯Dom4j提供的基础⽅法对每个节点进⾏操作Document document = DocumentHelper.parseText("传⼊的报⽂");//获取⽂档根节点Element root = document.getRootElement();上⾯⽅法就已经获取到返回报⽂的根节点了,这个时候你就能获取到任何你想要的节点参数了例如:获取b2e0001-rs节点下⾯status的值Element rspcodElem = root.element("trans").element("trn-b2e0001-rs").element("status").element("rspcod");rspcodElem.getStringValue()//节点的值rspcodElem.getName()//节点名称想要获取其他节点值也与上⾯⽅法⼀样2.报⽂中含有规律重复节点处理例如接⼝中的历史余额查询返回的报⽂<?xml version="1.0" encoding="UTF-8"?><bocb2e version="120" locale="zh_CN"><head><termid>E192168000105</termid><trnid>04051003128</trnid><custid>133724203</custid><cusopr>135989127</cusopr><trncod>b2e0012</trncod><token>PCxkDXIhAPRtlBhuqF-6A-V</token></head><trans><trn-b2e0012-rs><status><rspcod>B001</rspcod><rspmsg>ok</rspmsg></status><b2e0012-rs><status><rspcod>B001</rspcod><rspmsg>ok</rspmsg></status><account><ibknum>47504</ibknum><actacn>726357720234</actacn><curcde>CNY</curcde></account><balance><bokbal>199799896.54</bokbal><avabal>199799871.54</avabal></balance><baldat>20180102</baldat></b2e0012-rs><b2e0012-rs><status><rspcod>B001</rspcod><rspmsg>ok</rspmsg></status><account><ibknum>47504</ibknum><actacn>726357720234</actacn><curcde>CNY</curcde></account><balance><bokbal>199799871.54</bokbal><avabal>199799871.54</avabal></balance><baldat>20180103</baldat></b2e0012-rs></trn-b2e0012-rs></trans></bocb2e>上⾯返回的报⽂中就有多个b2e0012-rs节点,这种情况就不能像上⾯简单的去获取,要特殊处理1.使⽤递归去遍历每个节点,在遍历到b2e0012-rs时候,操作就和普通的⼀样private static void getHistoryBalanceChildNodes(Element elem){HistoryBalanceBank historyBalanceBank=new HistoryBalanceBank();if (("b2e0012-rs").equals(elem.getName())){historyBalanceBank.setRspcod(elem.element("status").element("rspcod").getStringValue());historyBalanceBank.setRspmsg(elem.element("status").element("rspmsg").getStringValue());if (("B001").equals(elem.element("status").element("rspcod").getStringValue())){historyBalanceBank.setIbknum(elem.element("account").element("ibknum").getStringValue());historyBalanceBank.setActacn(elem.element("account").element("actacn").getStringValue());historyBalanceBank.setCurcde(elem.element("account").element("curcde").getStringValue());historyBalanceBank.setBokbal(elem.element("balance").element("bokbal").getStringValue());historyBalanceBank.setAvabal(elem.element("balance").element("avabal").getStringValue());historyBalanceBank.setBaldat(elem.element("baldat").getStringValue());}historyBalanceBanks.add(historyBalanceBank);}Iterator<Node> it= elem.nodeIterator();while (it.hasNext()){Node node = it.next();if (node instanceof Element){Element e1 = (Element)node;getHistoryBalanceChildNodes(e1);}}}2.上⾯的historyBalanceBanks是定义了⼀个全局静态变量//历史余额Listprivate static List<HistoryBalanceBank> historyBalanceBanks=new ArrayList<HistoryBalanceBank>();在调⽤递归⽅法之后将historyBalanceBanks塞⼊到返回的实体类中,⼤功告成。
- 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 容易理解得多。