多级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 ...
随机推荐
- JavaScript.InjectedScriptHost
"use strict"; (function(InjectedScriptHost, inspectedGlobalObject, injectedScriptId) { ...
- 《JAVA设计模式》之原型模式(Prototype)
在阎宏博士的<JAVA与模式>一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办 ...
- Linux系统的镜像文件iso下载地址
CentOS-6.1-x86_64-bin-DVD1.iso 官方网址:http://archive.kernel.org/centos-vault/6.1/isos/x86_64/ 下载链接地址:h ...
- Django Rest Framewoek
1 什么是RESTful REST 指的是一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.满足这些约束条件和原则的应用程序或设计就是 RESTful. 2 RESTful设计 ...
- window下 nginx 80端口被占用
问题:启动nginx没有反应,查看日志提示 bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in ...
- Maven入门指南10:Maven的生命周期和插件
一个完整的项目构建过程通常包括清理.编译.测试.打包.集成测试.验证.部署等步骤,Maven从中抽取了一套完善的.易扩展的生命周期.Maven的生命周期是抽象的,其中的具体任务都交由插件来完成.Mav ...
- java绘制带姓的圆
public class ImageGenerator { private static final Color[] colors = new Color[] { new Color(129, 198 ...
- H5中图片按照比例收缩,放大
需求:后台传过来的图片不能够压缩,即使部分被截取也可以 传统方案:设置img元素如下: width: auto; height: auto; max-width: 100%; max-height: ...
- webstorm2018
1.安装后修改hosts: windows\system32\drivers\etc 管理员权限修改 0.0.0.0 account.jetbrains.com 2. 选择activation c ...
- 手动实现一个vue的mvvm,思路解析
1.解析dom.fragment编译,初始化new watcher 2 ,数据劫持,Object.defineProperty(obj,key,{ configurable:true,// 可以配置 ...