多级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 ...
随机推荐
- 简单的C++11线程池实现
线程池的C++11简单实现,源代码来自Github上作者progschj,地址为:A simple C++11 Thread Pool implementation,具体博客可以参见Jakob's D ...
- [Linux] 026 光盘 yum 源搭建
光盘 yum 搭建步骤 (1) 挂载光盘 $ mount /dev/cdrom /mnt/cdrom/ (2) 让网络 yum 源文件失效 $ cd /etc/yum.repos.d/ $ mv Ce ...
- 55-python基础-python3-字典-删除键值对-del语句
字典-键值对的彻底删除 对于字典中不再需要的信息,可使用del 语句将相应的键—值对彻底删除. 使用del 语句时,必须指定字典名和要删除的键. 注意 删除的键—值对永远消失了.
- Using Keyboard Navigation
http://technet.microsoft.com/en-us/library/cc939835.aspx
- CodeChef A String Game(SG)
A String Game Problem code: ASTRGAME Submit All Submissions All submissions for this problem a ...
- 2019 Multi-University Training Contest 1 - 1009 - String - 贪心
不知道错在哪里. 是要把atop改成stop!两个弄混了.感谢自造样例. #include<bits/stdc++.h> using namespace std; typedef long ...
- [转]java web 文件上传
实现WEB开发中的文件上传功能,需完成如下二步操作: 在WEB页面中添加上传输入项,<input type=“life” name=“”>,使用时注意: 1. 必须要设置 ...
- Linux ssh的的用法
Linux ssh的的用法 ssh执行远程命令 1. 执行命令 1.执行单条命令 ubuntu@node1:~$ ssh ubuntu@172.16.10.102 hostname ubuntu@17 ...
- javascript跨浏览器操作xml
//跨浏览器获取xmlDom function getXMLDOM(xmlStr) { var xmlDom = null; if (typeof window.DOMParser != 'undef ...
- vue,一路走来(5)--微信登录
微信登录 今天又是周末了,想着博客还没记录完成.是的,下面记录一下微信登录遇到的问题. 在我的项目中,个人中心是需要完成授权登录才可以访问的,首先在定义路由的时候就需要多添加一个自定义字段requir ...