使用Dom4j进行XML解析

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 ESBhtml

3操做方法
在ESB流程中须要先查询出第三方系统须要的数据,再进行XML格式化处理后,调用第三方系统提供的Web Service服务,这里须要建立一个XML格式的数据。
3.1建立Document对象
这里采用如下方法主动建立document对象app

Document document = DocumentHelper.createDocument();dom

查询相关API发现还有另外两种建立对象的方法
1.读取XML文件,得到document对象工具

SAXReader reader = new SAXReader();性能

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

2.解析XML形式的文本,获得document对象编码

String text = "XXXX";spa

Document document = DocumentHelper.parseText(text);.net

3.2节点操做
建立document后,添加第一个节点orm

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属性操做
添加了节点后,须要在节点中进行说明此节点的含义,这时须要给这个节点添加属性

经过相关API找到其余的属性操做方法
1.取得某节点下的某属性

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

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.4XML和字符串转换
拼好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文件并对其进行增删改查操做。产品及附件http://pan.baidu.com/s/1kVCt5L9

相关文章
相关标签/搜索