zoukankan      html  css  js  c++  java
  • 使用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 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文件并对其进行增删改查操作       文档及附件下载

     

  • 相关阅读:
    jesperreport+ireport简单理解
    tomcat服务器奇异事件
    Spring+SpringMvc+Mybatis整合注意事项
    Websocket简单例子
    uploadify前台上传文件,java后台处理的例子
    违反完整约束条件 (XXX)
    插入排序
    选择排序
    冒泡算法(思路二)
    2-3树
  • 原文地址:https://www.cnblogs.com/agileai/p/5993076.html
Copyright © 2011-2022 走看看