简单结构的xml转换


import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;public class XmlUtil {/*** xml转换为map(只适用简单的xml(没有嵌套结构))** @param xml     xml的字符串* @param charset 编码类型* @return* @throws UnsupportedEncodingException* @throws DocumentException*/public static Map<String, String> xmlToMap(String xml, String charset) throws UnsupportedEncodingException, DocumentException, DocumentException {Map<String, String> respMap = new HashMap();SAXReader reader = new SAXReader();Document doc = reader.read(new ByteArrayInputStream(xml.getBytes(charset)));Element root = doc.getRootElement();xmlToMap(root, respMap);return respMap;}private static Map<String, String> xmlToMap(Element tmpElement, Map<String, String> respMap) {if (tmpElement.isTextOnly()) {respMap.put(tmpElement.getName(), tmpElement.getText());return respMap;}@SuppressWarnings("unchecked")Iterator<Element> eItor = tmpElement.elementIterator();while (eItor.hasNext()) {Element element = eItor.next();xmlToMap(element, respMap);}return respMap;}/*** map转换为xml** @param data(只适用简单的map(没有嵌套结构))* @return* @throws Exception*/public static String mapToXml(Map<String, String> data) throws Exception {org.w3c.dom.Document document = newDocumentBuilder().newDocument();org.w3c.dom.Element root = document.createElement("xml");document.appendChild(root);Iterator var3 = data.keySet().iterator();while (var3.hasNext()) {String key = (String) var3.next();String value = data.get(key);if (value == null) {value = "";}value = value.trim();org.w3c.dom.Element filed = document.createElement(key);filed.appendChild(document.createTextNode(value));root.appendChild(filed);}TransformerFactory tf = TransformerFactory.newInstance();Transformer transformer = tf.newTransformer();DOMSource source = new DOMSource(document);transformer.setOutputProperty("encoding", "UTF-8");transformer.setOutputProperty("indent", "yes");StringWriter writer = new StringWriter();StreamResult result = new StreamResult(writer);transformer.transform(source, result);String output = writer.getBuffer().toString();try {writer.close();} catch (Exception var10) {}return output;}private static DocumentBuilder newDocumentBuilder() throws ParserConfigurationException {DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);documentBuilderFactory.setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true);documentBuilderFactory.setXIncludeAware(false);documentBuilderFactory.setExpandEntityReferences(false);return documentBuilderFactory.newDocumentBuilder();}public static void main(String[] args) throws Exception {String s = "<xml>\n" +"<auth>\n" +"<randomStr>suiji</randomStr>\n" +"<token>3ed6b709d31e87af73216149dc510c6fc94975af</token>\n" +"</auth>\n" +"</xml>";System.out.println("------------xmlToMap---------------");Map<String, String> xmlToMap = xmlToMap(s, "UTF-8");for (Map.Entry<String, String> entry : xmlToMap.entrySet()) {String key = entry.getKey();String value = entry.getValue();System.out.println("key = " + key + ",value = " + value);}System.out.println("------------mapToXml---------------");String mapToXml = mapToXml(xmlToMap);System.out.println(mapToXml);}
}

复杂结构的xml转换为map

public class XmlUtil {//根节点private static String rootName = "xml";//节点没有值的情况下默认值private static String defaultNullValue = "";private static Map<String, AtomicInteger> map = new HashMap();/*** xml 转换为 map** @param xml* @return*/public static Map<String, Object> parse(String xml) {Map<String, Object> map = new HashMap();StringReader stringReader = null;try {stringReader = new StringReader(xml);XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(stringReader);map = doParse(reader);} catch (Throwable t) {throw new RuntimeException(t);} finally {if (null != stringReader) {try {stringReader.close();} catch (Exception e) {throw new RuntimeException(e);}}}return map;}/*** 真正开始解析转换* @param reader* @return* @throws Throwable*/private static Map<String, Object> doParse(XMLStreamReader reader) throws Throwable {Map<String, Object> map = new HashMap<String, Object>();Map<String, Object> currentMap = map;int event = reader.getEventType();List<String> names = new ArrayList<String>();int taglength = 0;String tagName = null;String tagValue = defaultNullValue;while (true) {switch (event) {case XMLStreamConstants.START_DOCUMENT:break;case XMLStreamConstants.START_ELEMENT:tagValue = defaultNullValue;tagName = reader.getLocalName();if (rootName.equals(tagName)) {break;}names.add(tagName);taglength++;currentMap = map;if (taglength > 1) {for (int i = 0; i < taglength - 1; i++) {Object object = currentMap.get(names.get(i));if (null == object) {object = new HashMap<String, Object>();currentMap.put(names.get(i), object);currentMap = (Map<String, Object>) object;} else {int currentTagNameSize = getSize(i + 1 + "" + names.get(i));if (currentTagNameSize > 1) {if (object instanceof Map) {List parentList = new ArrayList();parentList.add(object);Map tempMap = new HashMap();parentList.add(tempMap);currentMap.put(names.get(i), parentList);currentMap = tempMap;} else if (object instanceof List) {List parentList = (List) object;int parentListSize = parentList.size();if (parentListSize != currentTagNameSize) {Map tempMap = new HashMap();parentList.add(tempMap);currentMap = tempMap;} else {Map tempMap = (Map) parentList.get(parentList.size() - 1);currentMap = tempMap;}}} else {currentMap = (Map<String, Object>) object;}}}}add(names.size() + tagName);break;case XMLStreamConstants.CHARACTERS:tagValue = reader.getText();break;case XMLStreamConstants.END_ELEMENT:tagName = reader.getLocalName();if (rootName.equals(tagName)) {break;}currentMap = map;if (taglength > 1) {for (int i = 0; i < taglength - 1; i++) {Object object = currentMap.get(names.get(i));if (null == object) {//nothing to do} else {if (object instanceof List) {List list = (List) object;currentMap = (Map) list.get(list.size() - 1);} else if (object instanceof Map) {currentMap = (Map) object;}}}}Object oldValue = currentMap.get(tagName);if (!currentMap.containsKey(tagName)) {currentMap.put(tagName, tagValue);remove(names.size() + tagName);} else {if (oldValue instanceof List) {List list = (List) oldValue;if (list.size() > 0) {Object obj = list.get(0);if (obj instanceof String) {((List) oldValue).add(tagValue);remove(names.size() + tagName);}}} else if (oldValue instanceof Map) {} else {List tmpList = new ArrayList();currentMap.put(tagName, tmpList);tmpList.add(oldValue);tmpList.add(tagValue);remove(names.size() + tagName);}}tagValue = defaultNullValue;names.remove(names.size() - 1);taglength--;break;case XMLStreamConstants.END_DOCUMENT:break;}if (!reader.hasNext()) {break;}event = reader.next();}return map;}private static void add(String nodeName) {AtomicInteger integer = map.get(nodeName);if (null == integer) {integer = new AtomicInteger(0);map.put(nodeName, integer);}integer.incrementAndGet();}private static void remove(String nodeName) {AtomicInteger integer = map.get(nodeName);if (null != integer) {integer.decrementAndGet();}}private static int getSize(String nodeName) {AtomicInteger integer = map.get(nodeName);if (null == integer) {integer = new AtomicInteger(0);map.put(nodeName, integer);}return integer.intValue();}public static void main(String[] args) {String str = "<xml>\n" +"<auth>\n" +"<randomStr>suiji</randomStr>\n" +"<token>3ed6b709d31e87af73216149dc510c6fc94975af</token>\n" +"</auth>\n" +"<datas>\n" +"<dataStatus>\n" +"<errorCode>0</errorCode>\n" +"<errormsg>发送成功</errormsg>\n" +"<seqId>1</seqId>\n" +"<lastModifyTime>2018-07-26 11:01:38</lastModifyTime>\n" +"</dataStatus>\n" +"<dataStatus>\n" +"<errorCode>1</errorCode>\n" +"<errormsg>发送失败,手机号为空</errormsg>\n" +"<seqId>2</seqId>\n" +"<lastModifyTime>2018-07-26 11:02:38</lastModifyTime>\n" +"</dataStatus>\n" +"</datas>\n" +"</xml>";Map<String, Object> parse = XMLParserStaxUtil.parse(str);System.out.println(parse);}
}

Spring中设置返回 xml格式

@RequestMapping(value = "/updateSmsStatus", produces = {"application/xml;charset=UTF-8"})
public SmsInfoVo getSMSInfo(String xmlParam) throws Exception {//或者@RequestMapping(value = "/updateSmsStatus", produces = MediaType.APPLICATION_XML_VALUE)
public SmsInfoVo getSMSInfo(String xmlParam) throws Exception {//可配合使用该@XmlRootElement(name = "xml"),设置根节点名称,字节点无法使用
//这里是使用对象的属性名和xml的节点名称对象,比如 SmsVo result 对应  <result></result>//第一层
@XmlRootElement(name = "xml")
public class SmsInfoVo {private SmsVo result;
}
//第二层
public class SmsVo {private Integer errorCode;private String errorMsg;private String constantIdent;private SmsDataVos datalist;
}
//第三层
public class SmsDataVos {private List<SmsDataVo> smsDatas;
}
//第四层
public class SmsDataVo {private String seqId;private String phoneNum;private String msg;
}
//最终的结果为:
<xml><result><constantIdent>CLS01001</constantIdent><datalist><smsDatas><msg>3</msg><phoneNum>3</phoneNum><seqId>3</seqId></smsDatas><smsDatas><msg>4</msg><phoneNum>4</phoneNum><seqId>4</seqId></smsDatas></datalist><errorCode>0</errorCode><errorMsg>认证成功</errorMsg></result>
</xml>

xml与map的相互转换相关推荐

  1. XML与DataSet的相互转换类

    送给大家一个XML与DataSet的相互转换的类: XmlDatasetConvert 该类提供了四种方法: 1.将xml对象内容字符串转换为DataSet 2.将xml文件转换为DataSet 3. ...

  2. java解析xml转为Map

    之前开发过一个解析多层级xml文件的工具类,后来处理的时候发现,这种方式得到的map或json集合多一个key标签,在解析的时候会比较麻烦,于是根据需要在原有方法的基础上写出了另外的处理方法,总结记录 ...

  3. java xml map 方法_JAVA XML转换MAP 方法

    在开发过程中会调用soap接口,返回的数据就是xml形式,那么久需要对xml进行解析,对xml操作大家都还是比较不是很熟悉相比对于map的操作.所以我提供了这么一个方法,让大家对xml数据提取,转换成 ...

  4. Java工具类——通过配置XML验证Map

    Java工具类--通过配置XML验证Map 背景 在JavaWeb项目中,接收前端过来的参数时通常是使用我们的实体类进行接收的.但是呢,我们不能去决定已经搭建好的框架是怎么样的,在我接触的框架中有一种 ...

  5. Java实现xml与map互转

    此文档中包含单层和多层嵌套情况下,xml和map集合进行互转,具体代码如下: import java.util.HashMap; import java.util.List; import java. ...

  6. jaxb java xml序列化_XML编程总结(六)——使用JAXB进行java对象和xml格式之间的相互转换...

    (六)使用JAXB进行java对象和xml格式之间的相互转换 JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML ...

  7. 微信支付中xml和map互转

    现在用java做微信公众号的支付,支付过程将参数发给微信是以xml格式发送,接受过来的也是xml格式字符串.感觉网上的xml和map转化复杂就手写了一个,具体代码如下: package com.cij ...

  8. xml和map相互转化

    依赖 <!-- https://mvnrepository.com/artifact/dom4j/dom4j --><dependency><groupId>dom ...

  9. java递归多层(多节点)xml和map互相转换

    具体见代码 调用方法: 第一种map转xml:createXmlByMap(Map<String, Object> map,String parentName); 第二种map转xml:m ...

最新文章

  1. python 学习 之 第二章(条件、循环和其他语句)
  2. 二维矩阵与二维矩阵之间的卷积
  3. Git根据远程分支建立条新的远程分支
  4. 一起学Android之Menu
  5. aerials标准测试图像_Python 图像读写谁最快?不信就比一比
  6. 欢乐纪中A组莫名其妙赛【2019.6.6】
  7. 数据探索性分析_探索性数据分析
  8. strict=False 但还是size mismatch for []: copying a param with shape [] from checkpoint,the shape in cur
  9. 整套的操作体系:三点看股法
  10. 计算机信息管理专业技能评价,计算机信息管理专业个人技能范文
  11. rtsp连接断开_live555_RTSP连接建立以及请求消息处理过程
  12. 直播带货选品的时候要优先关注这三个关键点
  13. Generalised Dice Overlap as a Deep Learning Loss Function for Highly Unbalanced Segmentations
  14. LeetCode 127. Word Ladder
  15. 蓝屏dump分析教程,附分析工具WinDbg
  16. python 自动打包pyd
  17. 微服务启动报错:Shutting down DiscoveryClient
  18. 手把手撸一个小而美的日历组件
  19. Ubuntu16.04+智能车+YOLO
  20. Browser历险记】认识Browser浏览器

热门文章

  1. 【C语言趣味编程100题】
  2. 帮忙改一下狼人杀的错T_T
  3. RPGmaker MV EnemyBook 插件使用
  4. tomcat 中部署的应用响应json数据乱码解决办法
  5. 小谢同学的C语言之路————第一章 初遇C语言 第二集 数据类型
  6. Unity实现圆形旋转滚动视图
  7. 各个击破!高效解决游戏开发8大痛点
  8. 黑客搜索大法(Google Hacking)
  9. python:机器学习(五):(TensorFlow)
  10. 找到100亿个URL中重复的URL