使用dom4j解析xml文件,并轉(zhuǎn)出json格式問題
使用dom4j解析xml文件,并轉(zhuǎn)出json格式
我這邊的需要就是講xml格式的soap的響應(yīng)報(bào)文解析出來并返回給前端這個(gè)需求我本來是不會寫的 然后找我?guī)煾笌臀覍懙模?/p>
我怕以后自己遇到同樣的問題,所以在這里記錄下來首先要準(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>測試答案</content>\n" +
" <moduleId>core</moduleId>\n" +
" <nodeId>00156577104596500003005056aa3f45</nodeId>\n" +
" <relatedQuestions>測試問題</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)文解析出來,我這里使用的是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());
//用閱讀器讀取文檔對象
Document document = reader.read(is);
//獲取文檔對象的根節(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;
}解析出來的就是這樣的
{
"commands": [
{
"args": [
"ff8080816bf47a1b016c8f39b153000b",
"ff8080816bf47a1b016c8f3a1c4d000e"
],
"name": "prop.categoryId",
"state": "0"
},
{
"args": [
"ff8080816bf47a1b016c8f3a1c4d000e"
],
"name": "prop.objectId",
"state": "0"
},
{
"args": [
"94654758cf484e249bc71b52d6291cba"
],
"name": "prop.sessionId",
"state": "0"
}
],
"content": "測試答案",
"moduleId": "core",
"nodeId": "00156577104596500003005056aa3f45",
"relatedQuestions": "測試問題",
"similarity": "1.0",
"type": "1"
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
運(yùn)行Springboot測試類查詢數(shù)據(jù)庫數(shù)據(jù)顯示白網(wǎng)頁問題及解決方法
Spring Boot應(yīng)用未能啟動(dòng)的原因是它沒有找到合適的數(shù)據(jù)庫配置具體來說,它需要一個(gè)數(shù)據(jù)源(DataSource),但未能在你的配置中找出,也沒有找到任何嵌入式數(shù)據(jù)庫(H2, HSQL 或 Derby),本文給大家分享運(yùn)行Springboot測試類查詢數(shù)據(jù)庫數(shù)據(jù)顯示白網(wǎng)頁問題及解決方法,一起看看吧2023-11-11
Java實(shí)現(xiàn)PDF模板動(dòng)態(tài)賦值與文檔生成的多種方式
除了 iText 庫,在 Java 中還有其他一些庫可以用于處理 PDF 模板并進(jìn)行動(dòng)態(tài)賦值,這篇文章就來為大家詳細(xì)介紹幾種常見的庫及其使用示例吧2025-07-07
Java?HashMap的底層實(shí)現(xiàn)原理深度解析
HashMap基于數(shù)組+鏈表+紅黑樹結(jié)構(gòu),通過哈希算法和擴(kuò)容機(jī)制優(yōu)化性能,負(fù)載因子與樹化閾值平衡效率,是Java開發(fā)必備的高效數(shù)據(jù)結(jié)構(gòu),本文給大家介紹Java?HashMap的底層實(shí)現(xiàn)原理,感興趣的朋友一起看看吧2025-09-09
【java 多線程】守護(hù)線程與非守護(hù)線程的詳解
這篇文章主要介紹了java守護(hù)線程與非守護(hù)線程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

