1 概述 在進行ESB集成項目中,使用到了很多系統的介面,這些介面傳輸的數據大部分都採用了XML的格式,這樣在使用ESB開發服務時就需要對XML數據進行解析或拼接的操作,本文以項目中流程服務為例,講解一些常用的Dom4j對XML的操作。 2 名詞解釋 Dom4j:一個Java的XML API,用來讀 ...
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"); |
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文件並對其進行增刪改查操作 文檔及附件下載