使用Dom4j進行XML解析

来源:http://www.cnblogs.com/agileai/archive/2016/10/24/5993076.html
-Advertisement-
Play Games

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");
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文件並對其進行增刪改查操作       文檔及附件下載

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近新學的,C#中得三層架構 ————2016-10-23 表示層 業務邏輯層(BLL) 數據訪問層(DAL) 關聯:產生依賴關係 描述:三層體繫結構就是在客戶端和資料庫之間加一個中間層,通常情況下客戶端不能直接和資料庫進行交互,而是通過中間層和數據層進行交互的。 【表示層】 主要負責完成用戶和系統 ...
  • 在C#中,用於存儲的結構較多,如:DataTable,DataSet,List,Dictionary,Stack等結構,各種結構採用的存儲的方式存在差異,效率也必然各有優缺點。現在介紹一種後進先出的數據結構。 談到存儲結構,我們在項目中使用的較多。對於Task存儲結構,棧與隊列是類似的結構,在使用的 ...
  • C#學習中的一些演算法排序,不完整, @^_^@ 2016-10-23 ****************************************************************************************** 1.冒泡排序 是將對數組相鄰的元素進行比較,將最 ...
  • 文檔目錄 本節內容: 簡介 關於ISettingStore 定義設置 setting scope(設置範圍) 重寫設置定義 獲取設置值 服務端 客戶端 修改設置 關於緩存 關於ISettingStore setting scope(設置範圍) 重寫設置定義 服務端 客戶端 簡介 每個應用必需存儲一些 ...
  • 在Common中新建一個CookieHelper,全局調用 ...
  • 隨著項目深入,需要移植到安卓上,問題來了,QML安卓適配! 幸好PC端程式和手機屏幕長寬比例相似。雖然單位像素,尺寸不同,通過比例縮放,可以實現組件PC和安卓通用代碼。 第一步:定義全局的轉換函數(300,500是你的PC端設計尺寸) 第二步:將所有相關尺寸的都通過上面的轉換函數計算新值 第三步:對 ...
  • php採集神器CURL使用方法詳解 php採集神器CURL使用方法詳解 作者:佚名 更新時間:2016-10-21 作者:佚名 更新時間:2016-10-21 作者:佚名 更新時間:2016-10-21 對於做過數據採集的人來說,cURL一定不會陌生。雖然在PHP中有file_get_content ...
  • 首先我們要JavaWeb登陸的基本流程:JSP頁面發送請求——>Servlet——>Servlet通過調用方法從資料庫中得到數據並將結果返回頁面 我們先建立三個jsp頁面,包括login.jsp(登陸頁面)、index.jsp(顯示登陸成功後的信息)、error.jsp(登錄失敗的頁面),其中後兩個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...