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解析方案的更多相关文章

  1. XML解析方案

    在iOS中,解析XML的手段有很多 苹果原生 NSXMLParser:SAX方式解析,使用简单 第三方框架 libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析 GDa ...

  2. iOS开发之网络数据解析(二)--XML解析简介

    前言:本篇随笔介绍的是XML解析. 正文: 1.XML解析方式有2两种: DOM:一次性将整个XML数据加载进内存进行解析,比较适合解析小文件 SAX:从根元素开始,按顺序一个元素一个元素往下解析,比 ...

  3. 使用XWAF框架(5)——XML解析器:CXDP

    XWAF推出了自己的组合式XML文档解析器,英文名叫:“CXDP”,是“Combined XML Document Parser”的缩写.核心代码属XWAF原创,注释.日志和帮助文档采用全中文描述,特 ...

  4. iOS开发——网络篇——JSON和XML,NSJSONSerialization ,NSXMLParser(XML解析器),NSXMLParserDelegate,MJExtension (字典转模型),GDataXML(三方框架解析XML)

    一.JSON 1.JSON简介什么是JSONJSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典 ...

  5. JavaEE:XML解析

    XML解析技术概述1.XML 技术主要企业应用1)存储和传输数据 2)作为框架的配置文件2.使用xml 存储和传输数据涉及到以下两点1)通过程序生成xml2)读取xml 中数据 ---- xml 解析 ...

  6. XML解析(一) DOM解析

    XML解析技术主要有三种: (1)DOM(Document Object Model)文档对象模型:是 W3C 组织推荐的解析XML 的一种方式,即官方的XML解析技术. (2)SAX(Simple ...

  7. iOS - - JSON 和 XML解析

    JSON 和 XML 一.JSON 1.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 2.JSON的格 ...

  8. XML解析-Dom4j的DOM解析方式更新XML

    Dom4j工具,是非官方的,不在jdk中. 使用步骤: 1)导入dom4j的核心包. dom4j-1.6.1.jar 2)编写Dom4j读取xml文件的代码 1.更新XML 1.1.写出内容到xml文 ...

  9. nodeName,nodeValue未知 xml 入库方案 The ElementTree iterparse Function

    import xml.etree.ElementTree as ET from lxml.html import * from xmljson import badgerfish as bf from ...

随机推荐

  1. JS正则表达式校验金额

    //任意正整数,正小数(小数位不超过2位) var isNum=/^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/; var num = ...

  2. idea 快捷键汇总

    1.IDEA常用快捷键 Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+In ...

  3. php和java的优势

    现在市场上的电子商务软件基本上可归结为两大阵营,即PHP阵营和Java阵营.但对接触电子商务不久的用户来说,看到的往往只是它们的表相,只是明显的价格差异,却很难看出它们之间的实际差异.下面我们就为大家 ...

  4. [JSOI2007]建筑抢修(贪心+后悔)

    [JSOI2007]建筑抢修(贪心+后悔) 洛谷题目传送门 吐槽 这是一道经典的贪心后悔的题目 做过贪心加后悔的题目的应该一眼可以看出来 解题思路 首先按倒塌时间T2排序,再从1枚举到n,能修就修,发 ...

  5. 关于php中trim、ltrim和rtrim

    以ltrim为例 先看手册说明先 定义和用法 ltrim() 函数从字符串左侧删除空格或其他预定义字符. 语法 ltrim(string,charlist) 参数 描述 string 必需.规定要转换 ...

  6. python爬取企业登记业务

    import requests from lxml import etree import csv for i in range(10, 990, 10): url = "http://12 ...

  7. P4390 [BOI2007]Mokia 摩基亚

    传送门 对于一个询问 $(xa,ya),(xb,yb)$,拆成 $4$ 个询问并容斥一下 具体就是把询问变成求小于等于 $xb,yb$ 的点数,减去小于等于 $xa-1,yb$ 和小于等于 $xb,y ...

  8. 贪心策略---买卖股票的最大收益 II

    买卖股票的最大收益 II 122. Best Time to Buy and Sell Stock II (Easy) 题目描述:   可以进行多次交易,多次交易之间不能交叉进行,可以进行多次交易. ...

  9. 从“中产梦”中醒来,好好打工吧

    "中产"定义 自打"中产阶级/阶层"概念出现,总有人试图给出定义.搞不清何为"中产"却试图定义"中产阶级/阶层",注定是 ...

  10. docker镜像源设置

    由于docker默认镜像源为国外官方源,下载速度较慢.设置国内镜像源可加速 修改文件 /etc/docker/daemon.json vi /etc/docker/daemon.json 添加以下内容 ...