jdom 的xml / map 互转
来源:互联网 发布:c语言函数的递归调用 编辑:程序博客网 时间:2024/05/16 07:21
package com.mymhotel.opera;import java.io.IOException;import java.io.StringReader;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.jdom.Attribute;import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder;public class XmlUtil { /** * 取得xml文件的根节点名称,即消息名称。 * * @param xmlStr * xml内容 * @return String 返回名称 */ public static String getRootName(String xmlStr) throws Exception { SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(new StringReader(xmlStr)); Element root = doc.getRootElement(); return root.getName(); } /** * 把xml文件转换为map形式,其中key为有值的节点名称,并以其所有的祖先节点为前缀,用 * "."相连接。如:SubscribeServiceReq.Send_Address.Address_Info.DeviceType * * @param xmlStr * xml内容 * @return Map 转换为map返回 */ public static Map<String, String> xml2Map(String xmlStr) throws JDOMException, IOException { Map<String, String> rtnMap = new HashMap<String, String>(); SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(new StringReader(xmlStr)); // 得到根节点 Element root = doc.getRootElement(); String rootName = root.getName(); rtnMap.put("root.name", rootName); // 调用递归函数,得到所有最底层元素的名称和值,加入map中 convert(root, rtnMap, rootName); return rtnMap; } /** * 递归函数,找出最下层的节点并加入到map中,由xml2Map方法调用。 * * @param e * xml节点,包括根节点 * @param map * 目标map * @param lastname * 从根节点到上一级节点名称连接的字串 */ public static void convert(Element e, Map<String, String> map, String lastname) { if (e.getAttributes().size() > 0) { Iterator it_attr = e.getAttributes().iterator(); while (it_attr.hasNext()) { Attribute attribute = (Attribute) it_attr.next(); String attrname = attribute.getName(); String attrvalue = e.getAttributeValue(attrname); //map.put( attrname, attrvalue); map.put(lastname + "." + attrname, attrvalue); //key 根据根节点 进行生成 } } List children = e.getChildren(); Iterator it = children.iterator(); while (it.hasNext()) { Element child = (Element) it.next(); /*String name = lastname + "." + child.getName();*/ String name = child.getName(); // 如果有子节点,则递归调用 if (child.getChildren().size() > 0) { convert(child, map, lastname + "." + child.getName()); } else { // 如果没有子节点,则把值加入map map.put(name, child.getText()); // 如果该节点有属性,则把所有的属性值也加入map if (child.getAttributes().size() > 0) { Iterator attr = child.getAttributes().iterator(); while (attr.hasNext()) { Attribute attribute = (Attribute) attr.next(); String attrname = attribute.getName(); String attrvalue = child.getAttributeValue(attrname); map.put(lastname + "." + child.getName() + "." + attrname, attrvalue); //map.put( attrname, attrvalue); } } } } } /** * 把xml文件转换为list形式,其中每个元素是一个map,map中的key为有值的节点名称,并以其所有的祖先节点为前缀,用 * "."相连接。如:SubscribeServiceReq.Send_Address.Address_Info.DeviceType * * @param xmlStr * xml内容 * @return Map 转换为map返回 */ public static List<Map<String, String>> xml2List(String xmlStr) throws JDOMException, IOException { List<Map<String, String>> rtnList = new ArrayList<Map<String, String>>(); Map<String, String> rtnMap = new HashMap<String, String>(); SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(new StringReader(xmlStr)); // 得到根节点 Element root = doc.getRootElement(); String rootName = root.getName(); rtnMap.put("root.name", rootName); // 调用递归函数,得到所有最底层元素的名称和值,加入map中 convert2List(root, rtnMap, rootName, rtnList); if (rtnList.size() == 0) rtnList.add(rtnMap); return rtnList; } /** * 递归函数,找出最下层的节点并加入到map中,如果有相同的节点,则加入list中, 由xml2List方法调用。 * * @param e * xml节点,包括根节点 * @param map * 目标map * @param lastname * 从根节点到上一级节点名称连接的字串 * @param list * 相同节点生成map放入list中 */ public static void convert2List(Element e, Map<String, String> map, String lastname, List<Map<String, String>> list) { if (e.getAttributes().size() > 0) { Iterator it_attr = e.getAttributes().iterator(); while (it_attr.hasNext()) { Attribute attribute = (Attribute) it_attr.next(); String attrname = attribute.getName(); String attrvalue = e.getAttributeValue(attrname); map.put(attrname, attrvalue); } } List children = e.getChildren(); Iterator it = children.iterator(); while (it.hasNext()) { Element child = (Element) it.next(); String name = lastname + "." + child.getName(); // 如果有子节点,则递归调用 if (child.getChildren().size() > 0) { convert(child, map, name); } else { // 如果没有子节点,则把值加入map map.put(name, child.getText()); // 如果该节点有属性,则把所有的属性值也加入map if (child.getAttributes().size() > 0) { Iterator attr = child.getAttributes().iterator(); while (attr.hasNext()) { Attribute attribute = (Attribute) attr.next(); String attrname = attribute.getName(); String attrvalue = child.getAttributeValue(attrname); map.put(name + "." + attrname, attrvalue); } } } // 如果有相同节点,则加入list中,不考虑子节点中又有相同节点的情况 if (e.getChildren(child.getName()).size() > 1) { Map<String, String> aMap = new HashMap<String, String>(); aMap.putAll(map); list.add(aMap); map = new HashMap<String, String>(); map.put("root.name", aMap.get("root.name")); } } } /** * 打印map 的所有key和value * * @param map */ public static void printMap(Map<String, String> map) { Iterator<String> keys = map.keySet().iterator(); while (keys.hasNext()) { String key = keys.next(); System.out.println(key + ":" + map.get(key)); } } /** * 格式化xml * * @param xmlStr * @param encode * @return String * @date Apr 30, 2008 *//* @SuppressWarnings("deprecation") public static String formatXml(String xmlStr, String encode) { SAXBuilder sb = new SAXBuilder(); Reader reader = new StringReader(xmlStr); Document doc = null; try { doc = sb.build(reader); } catch (Exception e) { // do nosth } XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); outputter.setEncoding(encode); String result = ""; if (null != doc) { result = outputter.outputString(doc); } return result; }*/}
- jdom 的xml / map 互转
- xml的dom4j jdom
- java jdom 将xml转map
- JDOM读写XML的例子
- JDOM对xml的解析
- xml文件的jdom解析
- 操作XML文件的jdom
- jdom 对xml的操作
- jdom解析XML的问题
- JDOM & XML
- jDom --xml
- 基于XML的无限分类(jdom+xpath)
- xml的Jdom解析过程详解
- 使用JDOM处理XML文档的技巧
- JDOM 解析 XML的常用方法
- JDOM处理XML文档的例子
- Jdom:高效的XML处理Java API
- 基于jdom实现xml的schema验证
- vmware workstation虚拟机连接宿主机:桥接、NAT和Host-only是什么
- 林赛登《花花公子》后桃花旺 与神秘男车场约会_0
- android HTTP形式连接服务器
- Android代码jar打包Library项目整合
- java,hibernate和sql server对应的数据类型
- jdom 的xml / map 互转
- Spring 配置数据源及properties配置文件加载
- log4j 使用说明总结
- 网址
- 《千山暮雪》落下帷幕 张然因悦莹获封最佳闺蜜_0
- 根据xml模版直接操作xml 并给占位符 赋值 同时转换成 String
- IpCamera视频开发解决方案
- C#同步网络时间
- cmd访问被拒绝,因为您没有足够的特权