使用dom4j解析xml文件,并轉(zhuǎn)出json格式問題
使用dom4j解析xml文件,并轉(zhuǎn)出json格式
我這邊的需要就是講xml格式的soap的響應(yīng)報(bào)文解析出來(lái)并返回給前端這個(gè)需求我本來(lái)是不會(huì)寫的 然后找我?guī)煾笌臀覍懙模?/p>
我怕以后自己遇到同樣的問題,所以在這里記錄下來(lái)首先要準(zhǔn)備的依賴
<!--dom4j-->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>String xml = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
" <soap:Body>\n" +
" <ns2:askResponse xmlns:ns2=\"http://www.eastrobot.cn/ws/AskService\" xmlns:ns3=\"http://www.eastrobot.cn/ws/RobotServiceEx\">\n" +
" <robotResponse>\n" +
" <commands>\n" +
" <args>ff8080816bf47a1b016c8f39b153000b</args>\n" +
" <args>ff8080816bf47a1b016c8f3a1c4d000e</args>\n" +
" <name>prop.categoryId</name>\n" +
" <state>0</state>\n" +
" </commands>\n" +
" <commands>\n" +
" <args>ff8080816bf47a1b016c8f3a1c4d000e</args>\n" +
" <name>prop.objectId</name>\n" +
" <state>0</state>\n" +
" </commands>\n" +
" <commands>\n" +
" <args>94654758cf484e249bc71b52d6291cba</args>\n" +
" <name>prop.sessionId</name>\n" +
" <state>0</state>\n" +
" </commands>\n" +
" <content>測(cè)試答案</content>\n" +
" <moduleId>core</moduleId>\n" +
" <nodeId>00156577104596500003005056aa3f45</nodeId>\n" +
" <relatedQuestions>測(cè)試問題</relatedQuestions>\n" +
" <similarity>1.0</similarity>\n" +
" <type>1</type>\n" +
" </robotResponse>\n" +
" </ns2:askResponse>\n" +
" </soap:Body>\n" +
"</soap:Envelope>";這是一個(gè)xml格式的soap的響應(yīng)報(bào)文
現(xiàn)在的需求就是將這個(gè)報(bào)文解析出來(lái),我這里使用的是dom4j解析
public static JsonObject xmlToJson(String xml) throws Exception{
//創(chuàng)建jsonobject
JsonObject object = new JsonObject();
//創(chuàng)建JsonArray
JsonArray array = new JsonArray();
//將array添加到object中
object.add("commands",array);
//創(chuàng)建一個(gè)SAXReader閱讀器
SAXReader reader = new SAXReader();
//根據(jù)字符串構(gòu)建字節(jié)數(shù)組輸入流
InputStream is = new ByteArrayInputStream(xml.getBytes());
//用閱讀器讀取文檔對(duì)象
Document document = reader.read(is);
//獲取文檔對(duì)象的根節(jié)點(diǎn)
log.info("開始解析soap報(bào)文");
Element root = document.getRootElement();
//遍歷子節(jié)點(diǎn)
for (Iterator iterator = root.elementIterator(); iterator.hasNext(); ) {
Element bodyElement = (Element) iterator.next();
for (Iterator iterator1 = bodyElement.elementIterator(); iterator1.hasNext(); ) {
Element askResponseElement = (Element) iterator1.next();
for (Iterator iterator2 = askResponseElement.elementIterator(); iterator2.hasNext(); ) {
Element robotResponseElement = (Element) iterator2.next();
for (Iterator iterator3 = robotResponseElement.elementIterator(); iterator3.hasNext(); ) {
Element element = (Element) iterator3.next();
String name = element.getName();
if ("commands".equals(name)) {
JsonObject ele = new JsonObject();
array.add(ele);
JsonArray subArray = new JsonArray();
ele.add("args",subArray);
for (Iterator iterator4 = element.elementIterator(); iterator4.hasNext(); ) {
Element subElement = (Element) iterator4.next();
String subName = subElement.getName();
if ("args".equalsIgnoreCase(subName)){
subArray.add(subElement.getStringValue());
}else {
ele.addProperty(subName, subElement.getStringValue());
}
// System.out.println(subElement.getName() + ":" + subElement.getStringValue());
}
} else {
object.addProperty(name, element.getStringValue());
// System.out.println(name + ":" + element.getStringValue());
}
}
}
}
}
log.info("json格式的報(bào)文={}",object);
return object;
}解析出來(lái)的就是這樣的
{
"commands": [
{
"args": [
"ff8080816bf47a1b016c8f39b153000b",
"ff8080816bf47a1b016c8f3a1c4d000e"
],
"name": "prop.categoryId",
"state": "0"
},
{
"args": [
"ff8080816bf47a1b016c8f3a1c4d000e"
],
"name": "prop.objectId",
"state": "0"
},
{
"args": [
"94654758cf484e249bc71b52d6291cba"
],
"name": "prop.sessionId",
"state": "0"
}
],
"content": "測(cè)試答案",
"moduleId": "core",
"nodeId": "00156577104596500003005056aa3f45",
"relatedQuestions": "測(cè)試問題",
"similarity": "1.0",
"type": "1"
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)經(jīng)典游戲Flappy Bird的示例代碼
Flappy?Bird是13年紅極一時(shí)的小游戲,即摁上鍵控制鳥的位置穿過管道間的縫隙。本文將用Java語(yǔ)言實(shí)現(xiàn)這一經(jīng)典的游戲,需要的可以參考一下2022-02-02
MyBatis?如何使項(xiàng)目兼容多種數(shù)據(jù)庫(kù)的解決方案
要想做兼容多種數(shù)據(jù)庫(kù),那毫無(wú)疑問,我們首先得明確我們要兼容哪些數(shù)據(jù)庫(kù),他們的數(shù)據(jù)庫(kù)產(chǎn)品名稱是什么,本次我們講解了一套使項(xiàng)目兼容多種數(shù)據(jù)庫(kù)的方案,對(duì)MyBatis項(xiàng)目兼容多種數(shù)據(jù)庫(kù)操作方法感興趣的朋友一起看看吧2024-05-05
Spring Security使用Lambda DSL配置流程詳解
Spring Security 5.2 對(duì) Lambda DSL 語(yǔ)法的增強(qiáng),允許使用lambda配置HttpSecurity、ServerHttpSecurity,重要提醒,之前的配置方法仍然有效。lambda的添加旨在提供更大的靈活性,但是用法是可選的。讓我們看一下HttpSecurity的lambda配置與以前的配置樣式相比2023-02-02
java后端如何調(diào)用第三方接口(往header和body中的參數(shù)傳參)
這篇文章主要介紹了java后端如何調(diào)用第三方接口(往header和body中的參數(shù)傳參),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
java中使用雪花算法(Snowflake)為分布式系統(tǒng)生成全局唯一ID代碼示例
Java雪花算法是一種用于生成唯一ID的算法,它可以在分布式系統(tǒng)中生成全局唯一的ID,這篇文章主要給大家介紹了關(guān)于java中使用雪花算法(Snowflake)為分布式系統(tǒng)生成全局唯一ID的相關(guān)資料,需要的朋友可以參考下2024-07-07
Java實(shí)現(xiàn)調(diào)用接口API并返回?cái)?shù)據(jù)
這篇文章主要介紹了Java實(shí)現(xiàn)調(diào)用接口API并返回?cái)?shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
IDEA2022.1創(chuàng)建maven項(xiàng)目規(guī)避idea2022新建maven項(xiàng)目卡死無(wú)反應(yīng)問題
這篇文章主要介紹了IDEA2022.1創(chuàng)建maven項(xiàng)目規(guī)避idea2022新建maven項(xiàng)目卡死無(wú)反應(yīng)問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08

