多级xml解析方案
- package com.people.xmlToSql;
- import java.io.File;
- import java.io.IOException;
- import java.io.StringWriter;
- import org.jdom.Document;
- import org.jdom.input.SAXBuilder;
- import org.jdom.output.Format;
- import org.jdom.output.XMLOutputter;
- /**
- * 读取一个xml文件返回string
- * @author lmb
- *
- */
- public class T {
- /**
- * 加载xml文件
- * @return Document
- */
- public static Document load(){
- Document document=null;
- String url="E://QQ//batch2.xml";
- try {
- SAXBuilder reader = new SAXBuilder();
- document=reader.build(new File(url));
- } catch (Exception e) {
- e.printStackTrace();
- }
- return document;
- }
- /**
- * 将xml文件转换为String串
- * @return
- */
- public static String XmlToString(){
- Document document=null;
- document=load();
- Format format =Format.getPrettyFormat();
- format.setEncoding("UTF-8");//设置编码格式
- StringWriter out=null; //输出对象
- String sReturn =""; //输出字符串
- XMLOutputter outputter =new XMLOutputter();
- out=new StringWriter();
- try {
- outputter.output(document,out);
- } catch (IOException e) {
- e.printStackTrace();
- }
- sReturn=out.toString();
- return sReturn;
- }
- }
- package com.people.xmlToSql;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import net.sf.json.JSONObject;
- import org.apache.log4j.Logger;
- import org.dom4j.Document;
- import org.dom4j.DocumentException;
- import org.dom4j.DocumentHelper;
- import org.dom4j.Element;
- import org.dom4j.Namespace;
- import org.dom4j.QName;
- /**
- * 解析xml的工具类
- * 1、将多层级xml解析为Map
- * 2、将多层级xml解析为Json
- *
- * @author lmb
- *
- */
- public class T1 {
- public static Logger logger = Logger.getLogger(T1.class);
- public static void main(String[] args) {
- // 获取一个xml文件
- String textFromFile = T.XmlToString();
- //将xml解析为Map
- // Map resultMap = xml2map(textFromFile);
- //将xml解析为Json
- String resultJson = xml2Json(textFromFile);
- }
- /**
- * 将xml格式响应报文解析为Json格式
- * @param responseXmlTemp
- * @return
- */
- public static String xml2Json(String responseXmlTemp) {
- Document doc = null;
- try {
- doc = DocumentHelper.parseText(responseXmlTemp);
- } catch (DocumentException e) {
- logger.error("parse text error : " + e);
- }
- Element rootElement = doc.getRootElement();
- Map<String,Object> mapXml = new HashMap<String,Object>();
- element2Map(mapXml,rootElement);
- String jsonXml = JSONObject.fromObject(mapXml).toString();
- System.out.println("Json >>> " + jsonXml);
- return jsonXml;
- }
- /**
- * 将xml格式响应报文解析为Map格式
- * @param responseXmlTemp
- * @param thirdXmlServiceBean
- * @return
- * @throws DocumentException
- */
- public static Map<String, Object> xml2map(String responseXmlTemp) {
- Document doc = null;
- try {
- doc = DocumentHelper.parseText(responseXmlTemp);
- } catch (DocumentException e) {
- logger.error("parse text error : " + e);
- }
- Element rootElement = doc.getRootElement();
- Map<String,Object> mapXml = new HashMap<String,Object>();
- element2Map(mapXml,rootElement);
- System.out.println("Map >>> " + mapXml);
- return mapXml;
- }
- /**
- * 使用递归调用将多层级xml转为map
- * @param map
- * @param rootElement
- */
- public static void element2Map(Map<String, Object> map, Element rootElement) {
- //获得当前节点的子节点
- List<Element> elements = rootElement.elements();
- if (elements.size() == 0) {
- //没有子节点说明当前节点是叶子节点,直接取值
- map.put(rootElement.getName(),rootElement.getText());
- }else if (elements.size() == 1) {
- //只有一个子节点说明不用考虑list的情况,继续递归
- Map<String,Object> tempMap = new HashMap<String,Object>();
- element2Map(tempMap,elements.get(0));
- map.put(rootElement.getName(),tempMap);
- }else {
- //多个子节点的话就要考虑list的情况了,特别是当多个子节点有名称相同的字段时
- Map<String,Object> tempMap = new HashMap<String,Object>();
- for (Element element : elements) {
- tempMap.put(element.getName(),null);
- }
- Set<String> keySet = tempMap.keySet();
- for (String string : keySet) {
- Namespace namespace = elements.get(0).getNamespace();
- List<Element> sameElements = rootElement.elements(new QName(string,namespace));
- //如果同名的数目大于1则表示要构建list
- if (sameElements.size() > 1) {
- List<Map> list = new ArrayList<Map>();
- for(Element element : sameElements){
- Map<String,Object> sameTempMap = new HashMap<String,Object>();
- element2Map(sameTempMap,element);
- list.add(sameTempMap);
- }
- map.put(string,list);
- }else {
- //同名的数量不大于1直接递归
- Map<String,Object> sameTempMap = new HashMap<String,Object>();
- element2Map(sameTempMap,sameElements.get(0));
- map.put(string,sameTempMap);
- }
- }
- }
- }
- }
多级xml解析方案的更多相关文章
- XML解析方案
在iOS中,解析XML的手段有很多 苹果原生 NSXMLParser:SAX方式解析,使用简单 第三方框架 libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析 GDa ...
- iOS开发之网络数据解析(二)--XML解析简介
前言:本篇随笔介绍的是XML解析. 正文: 1.XML解析方式有2两种: DOM:一次性将整个XML数据加载进内存进行解析,比较适合解析小文件 SAX:从根元素开始,按顺序一个元素一个元素往下解析,比 ...
- 使用XWAF框架(5)——XML解析器:CXDP
XWAF推出了自己的组合式XML文档解析器,英文名叫:“CXDP”,是“Combined XML Document Parser”的缩写.核心代码属XWAF原创,注释.日志和帮助文档采用全中文描述,特 ...
- iOS开发——网络篇——JSON和XML,NSJSONSerialization ,NSXMLParser(XML解析器),NSXMLParserDelegate,MJExtension (字典转模型),GDataXML(三方框架解析XML)
一.JSON 1.JSON简介什么是JSONJSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典 ...
- JavaEE:XML解析
XML解析技术概述1.XML 技术主要企业应用1)存储和传输数据 2)作为框架的配置文件2.使用xml 存储和传输数据涉及到以下两点1)通过程序生成xml2)读取xml 中数据 ---- xml 解析 ...
- XML解析(一) DOM解析
XML解析技术主要有三种: (1)DOM(Document Object Model)文档对象模型:是 W3C 组织推荐的解析XML 的一种方式,即官方的XML解析技术. (2)SAX(Simple ...
- iOS - - JSON 和 XML解析
JSON 和 XML 一.JSON 1.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 2.JSON的格 ...
- XML解析-Dom4j的DOM解析方式更新XML
Dom4j工具,是非官方的,不在jdk中. 使用步骤: 1)导入dom4j的核心包. dom4j-1.6.1.jar 2)编写Dom4j读取xml文件的代码 1.更新XML 1.1.写出内容到xml文 ...
- nodeName,nodeValue未知 xml 入库方案 The ElementTree iterparse Function
import xml.etree.ElementTree as ET from lxml.html import * from xmljson import badgerfish as bf from ...
随机推荐
- 自定义Aspect风格的AOP框架
本篇博客参考<架构探险--从零开始写java web框架>4.3章节 1代理接口: package smart.myaop.framework; public interface Prox ...
- spring-第二篇ApplicationContext国际化及事件机制
1.ApplicationContext接口获取spring容器 ApplicationContext是BeanFactory接口的子接口,BeanFactory的常用实现类是Default ...
- 动态规划——稀疏表求解RMQ问题
RMQ (Range Minimum/Maximum Query)问题,即区间最值查询问题,是求解序列中的某一段的最值的问题.如果只需要询问一次,那遍历枚举(复杂度O(n))就是最方便且高效的方法,但 ...
- k3 cloud库存管理中的直接调拨单权限分配出现问题
k3 cloud中给直接调拨单分配了对应的权限,但是客户端无法查看到对应的单据 解决办法: 是应为没有发布到对应的客户端和浏览器端,打开bos,找到对应的单据并点击发布,找到对应的目录,如图所示: 把 ...
- 如何处理HTML5新标签的浏览器兼容性问题?
① IE8/IE7/IE6支持通过document.createElement方法产生的标签,可以利用这一特性让这些浏览器支持HTML5新标签 ② 也可以使用成熟的框架 ex:html5shim &l ...
- VS code 生成html模板快捷键
第一步:在空html文档中输入 ! 第二步:按下tab键.
- 关于vuex中的状态变量的思考???
store中存取的为整个项目的公共变量,通过设置mutation来改变他们 假设现有如下代码: const store = new Vuex.Store({ state: { userInfo:{ n ...
- elasticsearch 进行聚合+去重查询
转载:https://www.jianshu.com/p/c03c3c8bf583 以客户customer为例 我想查询每日的客户数. 先按照日期分桶,然后在桶内按照 姓名来去重 来计算客户数(实际会 ...
- Java Web入门二
Web应用服务器 供向外发布web资源的服务器软件. Web资源 存在于Web服务器可供外界访问的资源就是web资源.例如:存在于web服务器内部的Html.CSS.js.图片.视频等. 静态资源 w ...
- Autoit 3 常用的语句
{系统环境变量} EnvUpdate ( ) ;更新环境变量 EnvGet ( "变量名称" ) ;取环境变量 ClipGet ( ) ;取剪辑板文本 EnvSet ( " ...