1  概述

  在进行ESB集成项目中,使用到了很多系统的接口,这些接口传输的数据大部分都采用了XML的格式,这样在使用ESB开发服务时就需要对XML数据进行解析或拼接的操作,本文以项目中流程服务为例,讲解一些常用的Dom4j对XML的操作。

2  名词解释

Dom4j:一个Java的XML API,用来读写XML文件的,具有性能优异、功能强大和极端易用使用的特点。

使用Dom4j需要使用对应的jar包,官网下载地址:

http://www.dom4j.org/dom4j-1.6.1/

Dom4jAPI地址:

http://www.oschina.net/uploads/doc/dom4j-1.6.1/index.html

AEAI ESB:应用集成平台主要作为企业信息系统的“龙骨”来集成各业务系统,一般称之为企业服务总线(Enterprise Service BUS,ESB),在数通畅联软件的产品家族中应用集成平台命名为AEAI ESB

3  操作方法

  在ESB流程中需要先查询出第三方系统需要的数据,再进行XML格式化处理后,调用第三方系统提供的Web Service服务,这里需要创建一个XML格式的数据。

3.1 创建Document对象

  这里采用以下方法主动创建document对象

Document document = DocumentHelper.createDocument();

  查询相关API发现还有另外两种创建对象的方法

  1.读取XML文件,获得document对象

SAXReader reader = new SAXReader();

Document   document = reader.read(new File("csdn.xml"));

  2.解析XML形式的文本,得到document对象

String text = "XXXX";

Document document = DocumentHelper.parseText(text);

3.2 节点操作

  创建document后,添加第一个节点

Element dataElement = document.addElement("DATA");

  这个节点作为根节点

  这里通过API来说明一下其他节点操作的方法

  1.获取根节点

  Element root = document.getRootElement();

  2.取得某个节点的子节点.

  Element element= root.element(“REQUESTDATA”);

  3.取得节点的内容

  String text= element.getText();

  4.取得某节点下所有名为” REQUESTDATA”的子节点,并进行遍历

List elements = rootElm.elements("csdn");

for (Iterator it = elements.iterator(); it.hasNext();) {

Element elm = (Element) it.next();

//操作处理

}

  5.对某节点下的所有子节点进行遍历

for(Iterator it=root.elementIterator();it.hasNext();){

Element element = (Element) it.next();

//操作处理

}

  6.设置节点文字

element.setText("XXXX");

  7.删除某节点

childElement是待删除的节点

parentElement是其父节点

parentElement.remove(childElment);

  8.添加一个CDATA节点

  在拼接完整的soap请求体时,涉及到soap请求体中添加XML格式数据时,不需要soap协议进行解析的内容,需要添加CDATA节点

Element contentElm = infoElm.addElement("content");

contentElm.addCDATA(“cdata区域”);

3.3 属性操作

  添加了节点后,需要在节点中进行说明此节点的含义,这时需要给这个节点添加属性

element.addAttribute("属性名 ", "内容");

  通过相关API找到其他的属性操作方法

  1.取得某节点下的某属性

Element root=document.getRootElement();

Attribute attribute=root.attribute("属性名");

  2.取得属性的内容

String text=attribute.getText();

  3.删除某属性

Attribute attribute=root.attribute("属性名");

root.remove(attribute);

  4.设置属性的内容

Attribute attribute=root.attribute("属性名");

attribute.setText("内容");

  5.遍历某节点的所有属性

Element root=document.getRootElement();

for(Iterator
it=root.attributeIterator();it.hasNext();){

Attribute attribute = (Attribute)
it.next();

//操作处理

}

3.4 XML和字符串转换

  拼好XML格式数据后,需要调用接口,而接口的入参类型为String,这里需要将拼好的Document对象转换为字符串,方式为

String docText=document.asXML();

  而将XML格式的字符串转换为document对象的方式为

String text = "XML格式数据";

Document document =
DocumentHelper.parseText(text);

4  其他说明

4.1 文档操作

  1.全为英文

XMLWriter writer = new XMLWriter(new  FileWriter("allEnglish.xml"));

writer.write(document);

writer.close();

  2.含有中文

OutputFormat format = OutputFormat.createPrettyPrint();

// 创建文件输出的时候,自动缩进的格式

format.setEncoding("UTF-8");

//设置编码

XMLWriter writer = new
XMLWriter(newFileWriter("contentChinese.xml"),format);

writer.write(document);

writer.close();

5  实例代码

  流程服务涉及到的部分相关代码

  创建document对象并拼接XML

DataRow
headerDataRow = (DataRow)
this.getVariable("headerDataRow").getValue();

//
XmlUtil是一个XML操作工具类,在数通畅联产品内置的jar包中

Document document =
XmlUtil.createDocument();

Element dataElement =
document.addElement("DATA");

dataElement.addElement("REQUESTDATA");

Element datainfosElement
= dataElement.addElement("DATAINFOS");

datainfosElement.addAttribute("REMARK",
"主表");

Element danhaoElement =
datainfosElement.addElement("DANHAO");

danhaoElement.addAttribute("REMARK",
"单号");

danhaoElement.addText(headerDataRow.getString("APPLY_NUMBER"));

Element xingmingElement =
datainfosElement.addElement("XINGMING");

xingmingElement.addAttribute("REMARK",
"姓名");

xingmingElement.addText(headerDataRow.getString("APPLY_USER_NAME"));

  解析接口返回的XML格式数据,并判断ESB_CODE节点的内容

//getVariable是ESB中封装好的方法,用于通过CODE值获取流程变量

String
soapResponse = (String)
this.getVariable("soapResponse").getValue();

Document document =
DocumentHelper.parseText(soapResponse);

Element root =
document.getRootElement();

Element resultCode =
root.element("ESB_CODE");

int resultMark = 0;

if("S".equals(resultCode.getText())){

resultMark = 1;

int applyId =
(Integer) this.getVariable("applyId").getValue();

DataRow updateRow
= new DataRow("APPLY_ID",applyId,"OA_FLAG","N");

this.getVariable("updateRow").setValue(updateRow);

}

  注:附件为操作样例工程代码,解析Project.xml文件并对其进行增删改查操作       文档及附件下载

使用Dom4j进行XML解析的更多相关文章

  1. DOM4J -(XML解析包)

    DOM4J - 简介 是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM, ...

  2. 使用DOM4J 对xml解析操作

    参考自:https://blog.csdn.net/redarmy_chen/article/details/12969219 dom4j是一个Java的XML API,类似于jdom,用来读写XML ...

  3. Dom4j 对XMl解析 新手学习,欢迎高手指正

    废话不多,先看代码 public static void main(String args[]){ ReaderXml("d:/example.xml");//读取XML,传入XM ...

  4. Java之dom4j的简单解析和生成xml的应用

    一.dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,它的性能超过sun公 ...

  5. JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)

    1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直 ...

  6. Java使用DOM4J对XML文件进行增删改查操作

    Java进行XML文件操作,代码如下: package com.founder.mrp.util; import java.io.File; import java.util.ArrayList; i ...

  7. 使用dom4j创建和解析xml文件

    使用dom4j创建和解析xml文件 在项目开发中,我们经常会遇到xml文件的创建和解析从别人接口得到的xml文件,而我们最常使用的组件是dom4j. 下面我就以代码来讲解一下如何使用dom4j来创建x ...

  8. Java XML解析工具 dom4j介绍及使用实例

    Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...

  9. 【Java】XML解析之DOM4J

    DOM4J介绍 dom4j是一个简单的开源库,用于处理XML. XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP,使用需要引用dom4j.jar包 ...

随机推荐

  1. angularjs组件之input mask

    今天将奉献一个在在几个angularjs项目中抽离的angular组件 input mask.在我们开发中经常会对用户的输入进行控制,比如日期,货币格式,或者纯数字格式之类的限制,这就是input m ...

  2. Netbeans+CodeIgniter搭建PHP开发环境

    为什么选这样的开发环境 常见的PHP集成开发环境有Eclipse+PDT,NetBeans,PHPEclipse,Zend Studio,PhpStorm等,我经过多方面的考虑(费用.易用性.功能.活 ...

  3. .NET中Dictionary<TKey, TValue>浅析

    .NET中Dictionary<TKey, Tvalue>是非常常用的key-value的数据结构,也就是其实就是传说中的哈希表..NET中还有一个叫做Hashtable的类型,两个类型都 ...

  4. Android多线程分析之三:Handler,Looper的实现

    Android多线程分析之三:Handler,Looper的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前文<Android多 ...

  5. 实践基于Task的异步模式

    Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...

  6. Java程序员的日常——SpringMVC+Mybatis开发流程、推荐系统

    今天大部分时间都在写业务代码,然后算是从无到有的配置了下spring与mybatis的集成. SpringMVC+Mybatis Web开发流程 配置数据源 在applicationContext.x ...

  7. paip. 提升性能---hibernate的缓存使用 总结

    paip. 提升性能---hibernate的缓存使用 总结 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog ...

  8. Cocos2d-x 3.X手游开发实例详解

    Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...

  9. Java项目——模拟电话薄联系人增删改查

    该项目模拟了电话本记录联系人的业务功能,用来练习对数据库的增删改查等操作. 菜单类:Menu -- 用来封装主菜单和个选项的子菜单 Person类: Person--联系人的实体类 TelNoteRe ...

  10. CSS层模型

    参考:慕课网 点此可进 如何让html元素在网页中精确定位,就像图像软件PhotoShop中的图层一样可以对每个图层能够精确定位操作.CSS定义了一组定位(positioning)属性来支持层布局模型 ...